home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / modem.aqm / modem.asm
Assembly Source File  |  1985-06-12  |  56KB  |  2,316 lines

  1. TITLE    MODEM FOR THE RAINBOW 100 SERIES WITH MS/DOS 2.05 +
  2. Page 62,132
  3.  
  4. ;
  5. ;****************************************************************
  6. ;*        M  O  D  E  M   - -   FOR THE RAINBOW        *
  7. ;*                                                              *
  8. ;*    This program was developed from                           *
  9. ;*         MODEM.ASM  (Version 3.0)                             *
  10. ;*         for CP/M to CP/M file transfers                      *
  11. ;*      BY Ward Christensen         (CPM-UG Disk # 25)          *
  12. ;*    Refer to the last section of this source file for         *
  13. ;*    a complete modification history and credits to            *
  14. ;*    those who contributed to this version.                    *
  15. ;*                                                              *
  16. ;*                                                              *
  17. ;*    PLEASE SEND PROBLEM REPORTS AND SUGGESTIONS               *
  18. ;*    TO:     John Chapman                                      *
  19. ;*            844 S. Madison St.                                *
  20. ;*            Hinsdale, Illinois  60521                         *
  21. ;*            Compuserve = 70205,1217                           *
  22. ;*                                *
  23. ;*  This version for the Digital Rainbow 100 computer with    *
  24. ;*      MS-DOS 2.05 + by James V. Colombo Rainbow SWE        *
  25. ;*                                *
  26. ;****************************************************************
  27. ;
  28.     SUBTTL    MACRO DEFINITIONS    
  29.     PAGE
  30. ;
  31. DOSCALL    MACRO    FUNCTION,AREA ;INVOKE DOS SERVICE
  32.     IFNB    <AREA>
  33.     MOV    DX,OFFSET AREA    ;SET PARAMETER OFFSET
  34.     ENDIF
  35.     MOV    AH,FUNCTION    ;DOS FUNCTION CODE
  36.     INT    21H        ;INVOKE DOS SERVICE
  37.     ENDM
  38. ;
  39. PRCHAR    MACRO    CHAR    ;PRINT A CHARACTER
  40.     IFNB    <CHAR>
  41.     MOV    DL,CHAR    ;CHAR TO DL REG
  42.     ENDIF
  43.     DOSCALL    DSPLO    ; DOS PRINT CHARACTER FUNCTION
  44.     ENDM
  45. ;
  46.     SUBTTL    STRUCTURES
  47.     PAGE
  48. ;
  49. CCB    STRUC
  50.  
  51. FUNCTION    DB    0        ; function #
  52. RETURN_CODE    DB    0        ; return code
  53. CHARACTER    DB    0        ; character
  54. CHAR_STATUS    DB    0        ; character status
  55. BUFFER        DB    0        ; CCB or buffer
  56.  
  57. CCB    ENDS
  58. ;
  59.     SUBTTL    EQUATES
  60.     page
  61. ;
  62. ROM    EQU    18H
  63. CR    EQU    13
  64. TAB    EQU    9
  65. LF    EQU    10
  66. PUTCHAR    EQU    11
  67. CANFLG    EQU    0           ;NO CANCEL ABILITY
  68. ;
  69. FASTCLK EQU    0           ;PUT 1 HERE FOR 4 MHZ CLOCK
  70. ERRLIM    EQU    10          ;MAX ALLOWABLE ERRORS
  71. EXITCHR    EQU    'W'-40H         ;CTL-W EXIT FROM T OR C
  72. DISCCHR    EQU    'D'-40H     ;CTL-D DISCONNECTS MODEM T/C
  73. CTLCCHR EQU    'O'-40H        ;CTL-C REPLACEMENT (temporary)
  74. CTLCHAR EQU    03H        ;CTL-C ACTUAL      (temporary)
  75. ;DEFINE ASCII CHARACTERS USED
  76. ;
  77. SOH    EQU    01H         ;START OF HEADER
  78. EOT    EQU    04H         ;END OF TRANSMISSION
  79. ACK    EQU    06H         ;ACKNOWLEDGE
  80. NAK    EQU    15H         ;NEG ACKNOWLEDGE
  81. CAN    EQU    18H         ;CANCEL
  82. FF    EQU    0CH        ;FORM FEED (clear screen)
  83.     PAGE
  84. ;
  85. ; MS DOS EQUATES
  86. ;
  87. REIPL    EQU    0        ;PROGRAM TERMINATE
  88. RDCON    EQU    1               ;KEYBOARD INPUT
  89. WRCON    EQU    2               ;DISPLAY OUTPUT
  90. PRTCHR    EQU    5        ;PRINTER OUTPUT, CHAR IN DL
  91. DCON    EQU    6               ;DIRECT CONSOLE I/O
  92. PRINT    EQU    9               ;PRINT STRING
  93. CONST    EQU    11          ;CONSOLE STAT
  94. OPEN    EQU    15          ;0FFH=NOT FOUND
  95. CLOSE    EQU    16          ;    "    "
  96. SRCHF    EQU    17          ;    "    "
  97. SRCHN    EQU    18          ;    "    "
  98. ERASE    EQU    19          ;NO RET CODE
  99. READ    EQU    20          ;0=OK, 1=EOF
  100. WRITE    EQU    21          ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  101. MAKE    EQU    22          ;0FFH=BAD
  102. REN    EQU    23          ;0FFH=BAD
  103. STDMA    EQU    26          ;SET DMA
  104. FATADDR EQU    27        ;FILE ALLOCATION TABLE ADDRESS
  105. ;
  106. ; d o s   f u n c t i o n s 
  107. ;
  108. DSPLO    EQU    2
  109. PSTRING    EQU    9
  110. DRESET    EQU    0DH    
  111. SELDSK    EQU    0EH
  112. CDISK    EQU    19H
  113. SETDTA    EQU    1AH
  114. SETINTV    EQU    25H
  115. GETDATE    EQU    2AH
  116. GETTIME    EQU    2CH
  117. ;
  118. ; MS DOS FCB EQUATES
  119. ;
  120. INT20H    EQU    DS:00H
  121. FCB    EQU    DS:5CH
  122. FCBNAME    EQU    DS:5DH
  123. FCBEXT    EQU    DS:65H
  124. FCBSZL     EQU    DS:6CH
  125. FCBSZH    EQU    DS:6DH
  126. FCBCR      EQU    DS:7CH
  127. FCBRR     EQU    DS:7DH
  128. FCB2       EQU    DS:6CH
  129. ;
  130. B0050    EQU    1        ; 50 baud
  131. B0075    EQU    2        ; 75 baud
  132. B0110    EQU    3        ; 110 baud
  133. B01345    EQU    4        ; 134.5 baud
  134. B0150    EQU    5        ; 150 baud
  135. B0200    EQU    6        ; 200 baud
  136. B0300    EQU    7        ; 300 baud
  137. B0600    EQU    8        ; 600 baud
  138. B1200    EQU    9        ; 1200 baud
  139. B1800    EQU    10        ; 1800 baud
  140. B2000    EQU    11        ; 2000 baud
  141. B2400    EQU    12        ; 2400 baud
  142. B3600    EQU    13        ; 3600 baud
  143. B4800    EQU    14        ; 4800 baud
  144. B9600    EQU    16        ; 9600 baud
  145. B19200    EQU    17        ; 19200 baud
  146. ;
  147.     SUBTTL    'PREFIX, CONSTANTS AND WORKAREA'
  148.     PAGE
  149. MODEM      SEGMENT PUBLIC 'CODE'
  150.         ASSUME  CS:MODEM,DS:MODEM,ES:MODEM
  151. ;
  152. ;       ----------------
  153. ;       START OF ACTUAL PROGRAM AREA 
  154. ;    ----------------
  155.         ORG     100H
  156. MAIN    PROC    FAR
  157.     JMP    STARTS
  158. OPTION    DB    0           ;PRIMARY OPTION
  159. ;
  160. ;DATAFLG IS USED BY THE "V" SUBCOMMAND -
  161. ;IT IS 0 WHEN A HEADER OR CKSUM IS BEING
  162. ;SENT/RCD, AND 1 IF "VIEWABLE" DATA (THE
  163. ;SECTOR ITSELF) IS
  164. ;
  165. DATAFLG    DB    0           ;AT HEADER, FIRST
  166. ;
  167. ;
  168. ;SUB-OPTION TABLE.  IF AN OPTION IS IN EFFECT,
  169. ;    THE CHARACTER IS SET TO BINARY 0
  170. ;
  171. OPTBL    Label    Word
  172.  
  173. ANSWFLG DB    'A'         ;ANSWER MODE
  174. DISCFLG    DB    'D'         ;DISCONNECT WHEN DONE
  175. ECHOFLG    DB    'E'         ;TO ECHO AFTER XFER
  176. DUMYFLG    DB    'U'        ;DEFAULT UART FLAG
  177. INITFLG DB    'I'        ;TO INIT THE UART / MODEM
  178. ORIGFLG DB    'O'         ;ORIGINATE MODE
  179. QFLG    DB    'Q'         ;QUIET TRANSFER (NO MSGS)
  180. RSEEFLG    DB    'R'         ;SEE WHAT'S RECEIVED
  181. SSEEFLG    DB    'S'         ;SEE WHAT'S SENT
  182. TERMFLG    DB    'T'         ;TO TERM AFTER XFER
  183. VSEEFLG    DB    'V'         ;VIEW MESSAGES (NO HDR, ETC)
  184. OPTBE    Label    Word        ;END OF OPTIONS
  185. ;
  186. TABLESIZE EQU    OPTBE-OPTBL
  187. ;
  188. RCVSNO    DB    0           ;SECT # RECEIVED
  189. SECTNO    DB    0           ;CURRENT SECTOR NUMBER 
  190. ERRCT    DB    0           ;ERROR COUNT
  191. SAVCHAR    DB    00        ;STORAGE FOR TERM
  192. ;
  193. ;    FOLLOWING 3 USED BY DISK BUFFERING ROUTINES
  194. ;
  195. EOFLG    DB    0           ;EOF FLAG (1=TRUE)
  196. SECPTR    DW    DBUF
  197. SECINBF    DB    0           ;# OF SECTORS IN BUFFER
  198. ;
  199. bdtab    db    010H        ; 16 entries
  200.     db    '020'
  201.     db    b0200
  202.     db    '110'
  203.     db    b0110
  204.     db    '120'
  205.     db    b1200
  206.     db    '134'
  207.     db    b01345
  208.     db    '150'
  209.     db    b0150
  210.     db    '180'
  211.     db    b1800
  212.     db    '192'
  213.     db    b19200
  214.     db    '200'
  215.     db    b2000
  216.     db    '240'
  217.     db    b2400
  218.     db    '300'
  219.     db    b0300
  220.     db    '360'
  221.     db    b3600
  222.     db    '480'
  223.     db    b4800
  224.     db    '50 '
  225.     db    b0050
  226.     db    '600'
  227.     db    b0600
  228.     db    '75 '
  229.     db    b0075
  230.     db    '960'
  231.     db    b9600
  232. ;
  233. ;       HELP MSGS 
  234. ;
  235. ;
  236. msg00    db    cr,lf
  237.  db '+----------------------------------------------------------------+',cr,lf
  238.  db '|                                                                |',cr,lf
  239.  db '|          M  O  D  E  M   - -   For the Rainbow 100 Series      |',cr,lf
  240.  db '|          Addapted by James V. Colombo   Rainbow SWE            |',cr,lf
  241.  db '|                         Version 3.3.4                          |',cr,lf
  242.  db '|                            01/18/85                            |',cr,lf
  243.  db '+----------------------------------------------------------------+',cr,lf
  244.  db     cr,lf,0,1
  245. ;
  246. ;
  247. MSG01    DB    CR,LF
  248. ;                1234567890123456789012345678901234567890123456789012345678901234567890
  249.     DB    '----  M  O  D  E  M  ----  ',cr,lf,cr,lf
  250.      db     'Converted from  MODEM 3.0 by Ward Christensen     ',cr,lf
  251.     DB    'Version 3.3.3 for The Rainbow by James V. Colombo',cr,lf
  252.     DB    '      R  E  A  D  Y        ',cr,lf  
  253.      db    cr,lf,'$',1,0
  254. MSG01A    DB    'File Open, Ready to Receive',CR,LF,0
  255. MSG02    DB    'Awaiting #',0
  256. MSG03A    DB    'h rcd, not soh',CR,LF,0
  257. MSG03    DB    '+++ TIMEOUT +++',0
  258. MSG04    DB    '++ Bad Sector # in Hdr',CR,LF,0
  259. MSG05    DB    '++ CKSUM ++',0
  260. MSG06    DB    'Send # ',0
  261. MSG07    DB    'h rcvd, not ack ',CR,LF,0
  262. MSG08    DB    'Timeout on ack',CR,LF,0
  263. MSG09    DB    'Modem Program Cancelled ',CR,LF,0
  264. MSG10    DB    'File exists, Type Y to erase ',0
  265. MSG11    DB    'Can not open file$'
  266. MSG12    DB    'File open, Extent Length ',0
  267. MSG13    DB    'Awaiting Initial nak',CR,LF,0
  268. MSG14    DB    cr,lf,'Transfer Complete',CR,LF,0
  269. MSG15    DB    cr,lf,'Press Return to Disconnect'
  270.     DB    cr,lf,'Press Space bar to Exit',0
  271. MSG16    DB    '++ EXITING ++',0
  272. MSG17    DB    cr,lf,'++ Do not Forget - The Modem is'
  273.     DB    'NOT Disconnected',CR,LF,0
  274. ;    DB    'Use "M3 D" to Disconnect',CR,LF,0
  275. MSG18    DB    'Multiple errors encountered. '
  276.     DB    'Type Q to quit, R to Retry ',0
  277. MSG19    DB    CR,LF,'Press Return to Continue'
  278.     DB    CR,LF,0
  279. MSG20    DB    '++ Unable to Receive Block'
  280.     DB    CR,LF,'++ ABORTING ++$'
  281. MSG21    DB    'Can not Send Sector '
  282.     DB    '- ABORTING',CR,LF,'$'
  283. MSG22    DB    '++ ERROR - Can not make file',CR,LF
  284.     DB    '++ Directory must be full',CR,LF,'$'
  285. MSG22A    DB    '++ Can not Close Files ++$'
  286. MSG23    DB    '++ File Read ERROR ++$'
  287. MSG24    DB    '++ ERROR Writing File ++',CR,LF,'$'
  288. MSG25    DB    'Invalid option on modem command',CR,LF
  289.     DB      'PRESS RETURN FOR HELP, CTL-C IF NOT',CR,LF,1,0
  290. MSG26    DB      'Format for command is',CR,LF,CR,LF
  291.     DB      'MODEM # FILENAME',CR,LF,CR,LF
  292.     DB      'Where # is a 1 character primary option,',CR,LF
  293.     DB      ' which may be followed by sub-options,',CR,LF
  294.     DB      ' and by ".xxx" to set baud rate to xxx'
  295.     DB      CR,LF,CR,LF
  296.     DB      'Primary Options',CR,LF,1
  297.     DB      '    S to send a file',CR,LF
  298.     DB      '    R to receive a file',CR,LF
  299.         DB      '    T to act as a terminal',CR,LF
  300.     DB      '    E to act as a computer (echo data)',CR,LF
  301.     DB      '    H to print this help file'
  302.     DB      CR,LF,CR,LF
  303.     DB      'Secondary options',CR,LF,1
  304.     DB      '    D disconnect after execution',CR,LF
  305.     DB      '    T go to terminal mode after file xfer',CR,LF
  306.     DB      '    E go to echo mode after file xfer',CR,LF
  307.     DB      '    Q quiet mode - no status msgs',CR,LF
  308.     DB      '    R show chars received',CR,LF
  309.     DB      '    S show chars sent',CR,LF
  310.     DB      '    V view file sent/received (no status)',CR,LF
  311.     DB      CR,LF,'FOR EXAMPLES, TYPE MODEM X',CR,LF,1,0
  312. MSG27    DB      'Send file, ',CR,LF
  313.     DB      '    MODEM S fn.ft',CR,LF
  314.     DB      'Send another file',CR,LF
  315.     DB      '    MODEM S fn.ft',CR,LF
  316.     DB      'Then send a third file at 450 baud and disconnect'
  317.     DB      CR,LF,'    MODEM SD.450 fn.ft',CR,LF
  318.     DB      'Act as a terminal (Default = 1200 baud) ',CR,LF
  319.     DB      '    MODEM T',CR,LF
  320.     DB    ' Use ctl-W to disonnect (drop DTR)',cr,lf
  321.     DB      ' Use ctl-D to exit',CR,LF
  322.     DB      'Receive file,  view it',CR,LF
  323.     DB      '    MODEM RV fn.ft',CR,LF,1,0
  324. ;
  325. DBUF    DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 1
  326.                 ;   (* Four physical sectors)
  327.     DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 2
  328.                 ;   (* Four physical sectors)
  329.                 ; TOTAL = one track on PC/DOS (8/512)
  330. ;    DB    'POOT'
  331.  
  332. INIT_CCB    CCB    <0,0,0,0,1>    ; Initialization control block
  333. mode         db    1        ;   Data Leads only
  334. stop_bits    db    1        ;   One stop bit
  335. bits        db    4        ;   Eight Bits
  336. parit        db    3        ;   No Parity
  337. brr        db    9        ;   Default to 1200 Baud - receive
  338. brt        db    9        ;   Default to 1200 Baud - transmit
  339. xon        db    11H        ;   Xon character
  340. xoff        db    13H        ;   Xoff character
  341. rxx        db    2        ;   Rx Auto Xon/Xoff
  342. txx        db    2        ;   Tx Auto Xon/Xoff
  343. bs        dw    256        ;   Size of comm buffer
  344. boff        dw    0        ;   Comm_buffer offset
  345. bsegm        dw    0        ;   Comm_buffer segment
  346. ;
  347. IN_CCB        CCB    <7,0,0,0,0>    ; Read input char
  348. ;
  349. OUT_CCB        CCB    <10,0,0,0,0>    ; Transmit character control block
  350. ;
  351. MISC_CCB    CCB    <0,0,0,0,0>    ; CCB for misc. use
  352. ;
  353.     SUBTTL    'MAIN PROGRAM SECTION'
  354.         PAGE
  355. STARTS:
  356. ;
  357. ;=============================================================================
  358. ;
  359. ;    PRINT THE STARTUP MESSAGE 
  360. ;
  361.     push    dx
  362.            MOV    DX,OFFSET MSG01    ;GET ID MESSAGE
  363.     MOV    CL,PRINT
  364.     CALL    BDOS         ;PRINT ID MESSAGE
  365.     pop    dx
  366. ;
  367. ;=============================================================================
  368. ;
  369. ;
  370. ;SAVE PRIMARY OPTION, VALIDATE SECONDARY OPT.
  371. ;
  372.     CALL    PROCOPT
  373. ;                IF WE RETURN FROM PROCOPT, A VALID
  374. ;            ACTION OPTION (not help or examples)
  375. ;            WAS FOUND .. PROCESSING CONTINUES
  376. ;
  377. ;INIT THE MODEM OR SERIAL PORT   (dtr UP always - THEN CHECK FOR "i" OPT.
  378. ;
  379.     CALL    INITMOD
  380. ;
  381. ;MOVE THE FILENAME FROM FCB 2 TO FCB 1
  382. ;
  383.     CALL    MOVEFCB
  384. ;
  385. ;JMP TO APPROPRIATE FUNCTION
  386. ;
  387.     MOV    AL,OPTION    ;GET PRIMARY OPTION
  388. ;
  389.     CMP    AL,'C'      ;(COMPAT W/EARLIER
  390.     JNZ    L00001
  391.     JMP    TRMECHO     ;OPTION "COMPUTER")
  392. ;
  393. L00001:    CMP    AL,'E'      ;TERMINAL IN ECHO
  394.     JNZ    L00002
  395.     JMP    TRMECHO     ;..MODE?
  396. ;
  397. L00002:    CMP    AL,'T'            ;TERMINAL..
  398.     JNZ    L00003
  399.     JMP    TERM            ;..MODE?
  400. ;
  401. L00003:
  402. ;    CMP    AL,'D'
  403. ;    JNZ    L00004
  404. ;    JMP    DISCONN
  405. ;L00004:
  406. ;
  407.     CMP    AL,'S'            ;SEND..
  408.     JNZ    L00005
  409.     JMP    SENDFIL            ;..A FILE?
  410. ;
  411. L00005:    CMP    AL,'R'            ;RECEIVE..
  412.     JNZ    L00006
  413.     JMP    RCVFIL            ;..A FILE?
  414. ;
  415. ;INVALID OPTION
  416. ;
  417.  
  418. L00006:    JMP    BADOPT          ;BAD OPTIONS !
  419. ;
  420. ; Return to MS-DOS after cleaning up the IOCTL drivers.
  421. ;
  422. ; Disable the receiver
  423. ;
  424. EXIT:
  425. ;
  426. ; Now program the device to use the default buffer.
  427. ;
  428.     MOV    Byte Ptr MISC_CCB.FUNCTION,05    ; Disable the receiver
  429.  
  430.     MOV    AX,4402H        ; IOCTL function program to default
  431.     MOV    BX,3            ; File handle for comms
  432.     MOV    DX,OFFSET MISC_CCB    ; DS:DX points to control block
  433.     INT    21H            ; Call MS-DOS
  434.     MOV    Byte Ptr MISC_CCB.FUNCTION,02    ; Use default buffer
  435.  
  436.     MOV    AX,4402H        ; IOCTL function program to default
  437.     MOV    BX,3            ; File handle for comms
  438.     MOV    DX,OFFSET MISC_CCB    ; DS:DX points to control block
  439.     INT    21H            ; Call MS-DOS
  440. ;
  441. ; Reprogram driver to NVM values
  442. ;
  443.     MOV    Byte Ptr MISC_CCB.FUNCTION,01    ; Reprogram to NVM value
  444.  
  445.     MOV    AX,4402H        ; IOCTL function program to default
  446.     MOV    BX,3            ; File handle for comms
  447.     MOV    DX,OFFSET MISC_CCB    ; DS:DX points to control block
  448.     INT    21H            ; Call MS-DOS
  449. ;
  450. ; Now exit to MS-DOS
  451. ;
  452.     MOV    AX,4C00H
  453.     INT    21H
  454.  
  455. MAIN    ENDP
  456.  
  457. ; * * * * * * * * * * * * * * * * * * * *
  458. ;                    *
  459. ;    TERM: TERMINAL MODE        *
  460. ;                    *
  461. ; * * * * * * * * * * * * * * * * * * * *
  462. ;
  463. ;THIS PROGRAM SIMPLY SENDS KEYED CHARACTERS
  464. ;DOWN THE LINE, AND DISPLAYS CHARACTERS
  465. ;RECEIVED FROM THE LINE.  THIS MAKES IT
  466. ;SUITABLE FOR COMMUNICATION WITH TIME SHARING
  467. ;COMPUTERS, CBBS'S, OR ANOTHER PROGRAM
  468. ;RUNING "MODEM E" (ECHO MODE)
  469. ;
  470. ;TYPEZZ THE "EXITCHR" (ORIGINALLY CTL-E) TO EXIT.
  471. ;OR THE "DISCCHR" (ORIGINALLY CTL-D) TO DISCONN.
  472. ;
  473. ;A FUTURE ENHANCEMENT WILL BE TO WRITE THE
  474. ;RECEIVED DATA IN MEMORY, AND ALLOW IT TO
  475. ;BE WRITTEN TO DISK
  476. ;
  477. TERM    PROC    NEAR
  478. ;
  479. ; See if there is a character available from the serial port
  480. ;
  481.     Call    Statit            ; Get status
  482.     Or    Al,Al            ; Character available?
  483.     Jz    Terml            ; If not, Loop
  484. ;
  485.     Call    Getit            ; Get character
  486.     CALL    TYPEZZ          ;TYPEZZ IT
  487. ;
  488. Terml:    Mov    AL,Byte Ptr Savchar
  489.     OR    AL,AL
  490.     Jnz    L00009
  491.     Call    Stat            ; Get keyboard status
  492.     JNZ    L00007            ; If so, get it!
  493.     JMP    TERM             ;..NO, CHECK LINE
  494. L00007:
  495.     CALL    KEYIN           ;GET CHAR
  496.     CMP    AL,EXITCHR        ;TIME TO END?
  497.     JNZ    L00008
  498.     JMP    CKDIS                ;YES, CK DISCONN
  499. L00008:
  500.     CMP    AL,DISCCHR        ;DISCONNECT REQUEST?
  501.     JNZ    L00009
  502.     JMP    DISCONN                ;YES, DO IT
  503. L00009:
  504.     Mov    Byte Ptr Savchar,00    ;Clear the saved character
  505.     Call    Sendit            ;Send character
  506.     Or    Ah,Ah            ;Was character sent?
  507.     Jne    Term            ;If so, loop
  508.     Mov    Byte Ptr Savchar,AL
  509.     JMP    TERM            ;LOOP
  510.  
  511. TERM    ENDP
  512. ; * * * * * * * * * * * * * * * * * * * *
  513. ;                    *
  514. ;    TRMECHO: TERMINAL WITH ECHO    *
  515. ;                    *
  516. ; * * * * * * * * * * * * * * * * * * * *
  517. ;
  518. ;TERMINAL PROGRAM WITH ECHO - SEE NOTES
  519. ;UNDER "TERM" ABOVE
  520. ;
  521. ;C A U T I O N   DON'T RUN WITH BOTH COMPUTERS
  522. ;IN "ECHO" MODE - LINE ERRORS (OR ANY CHAR)
  523. ;WILL BE ECHOED BACK AND FORTH AD INFINITUM.
  524. ;
  525. TRMECHO PROC    NEAR
  526.     Call    Statit        ;Get status
  527.     Or    Al,Al        ; Character available?
  528.     JZ    L00011        ; If so, get it!
  529.     JMP    LINECHR     ;YES, READ THE CHR
  530. L00011:    CALL    STAT        ;CHECK LOCAL KB
  531.     JNZ    L00012
  532.     JMP    TRMECHO     ;..NO CHAR
  533. L00012:    CALL    KEYIN       ;GET LOCAL CHAR
  534.     CMP    AL,EXITCHR    ;END?
  535.     JNZ    L00013
  536.     JMP    CKDIS       ;YES, CK DISCONN, EXIT
  537. L00013:    CMP    AL,DISCCHR    ;DISCONN?
  538.     JNZ    L00014
  539.     JMP    DISCONN     ;..YES, DO IT.
  540. L00014: Call    Sendit        ;Send character
  541.     Or    Ah,Ah        ;Was character sent?
  542.     Jz    L00014        ;If not, try again!
  543.     CALL    TYPEZZ      ;ECHO IT LOCALLY
  544.     JMP    TRMECHO     ;..AND LOOP
  545. ;
  546. ;GOT CHAR FROM LINE
  547. ;
  548. LINECHR:
  549.     Call    Getit        ; Get character
  550.     CALL    TYPEZZ      ;TYPEZZ IT
  551.     JMP    TRMECHO     ;LOOP
  552. TRMECHO    ENDP
  553. ;
  554. ; * * * * * * * * * * * * * * * * * * * *
  555. ;                    *
  556. ;    SENDFIL: SENDS A CP/M FILE    *
  557. ;                    *
  558. ; * * * * * * * * * * * * * * * * * * * *
  559. ;
  560. ;THE CP/M FILE SPECIFIED IN THE MODEM COMMAND
  561. ;IS TRANSFERRED OVER THE PHONE TO ANOTHER
  562. ;COMPUTER RUNNING MODEM WITH THE "R" (RECEIVE)
  563. ;OPTION.  THE DATA IS SENT ONE SECTOR AT A
  564. ;TIME WITH HEADERS AND CHECKSUMS, AND RE-
  565. ;TRANSMISSION ON ERRORS.  
  566. ;
  567. SENDFIL PROC     NEAR
  568. ;
  569. ; Turn off auto Xon/Xoff
  570. ;
  571.     Mov    Rxx,01h            ; Disable Rx Auto Xon
  572.     Mov    Txx,01h            ; Disable Tx Auto Xon
  573.     MOV    DX,OFFSET INIT_CCB    ; DS:DX points to control block
  574.     MOV    AX,4402H        ; IOCTL function program to default
  575.     MOV    BX,3            ; File handle for comms
  576.     INT    21H            ; Call MS-DOS
  577. ;
  578.         CALL    OPENFIL     ;OPEN THE FILE
  579.     MOV    DL,80       ;WAIT 80 SEC..
  580.     CALL    WAITNAK     ;..FOR INITIAL NAK
  581. SENDLP:    CALL    RDSECT      ;READ A SECTOR
  582.     JAE    L00016
  583.     JMP    SENDEOF     ;SEND EOF IF DONE
  584. L00016:    CALL    INCRSNO     ;BUMP SECTOR #
  585.     XOR    AL,AL       ;ZERO ERROR..
  586.     MOV     ERRCT,AL    ;..COUNT
  587. SENDRPT:
  588.         CALL    SENDHDR            ;SEND A HEADER
  589.     CALL    SENDSEC     ;SEND DATA SECTOR
  590.     CALL    SENDCKS     ;SEND CKSUM
  591.     CALL    GETACK      ;GET THE ACK
  592.     JAE    L00017
  593.     JMP    SENDRPT     ;REPEAT IF NO ACK
  594. L00017:    JMP    SENDLP      ;LOOP UNTIL EOF
  595. ;
  596. ;FILE SENT, SEND EOT'S
  597. ;
  598. SENDEOF:
  599.     MOV    AL,EOT      ;SEND..
  600.     CALL    SEND        ;..AN EOT
  601.     CALL    GETACK      ;GET THE ACK
  602.     JAE    L00018
  603.     JMP    SENDEOF     ;LOOP IF NO ACK
  604. ;
  605. ; Turn on auto Xon/Xoff
  606. ;
  607. L00018: Mov    Rxx,02h            ; Enable Rx Auto Xon
  608.     Mov    Txx,02h            ; Enable Tx Auto Xon
  609.     MOV    DX,OFFSET INIT_CCB    ; DS:DX points to control block
  610.     MOV    AX,4402H        ; IOCTL function program to default
  611.     MOV    BX,3            ; File handle for comms
  612.     INT    21H            ; Call MS-DOS
  613.     JMP    DONE                ;ALL DONE
  614. ;
  615. SENDFIL    ENDP
  616. ;
  617. ; * * * * * * * * * * * * * * * * * * * *
  618. ;                    *
  619. ;    RCVFIL: RECEIVE A FILE        *
  620. ;                    *
  621. ; * * * * * * * * * * * * * * * * * * * *
  622. ;
  623. ;RECEIVES A FILE IN BLOCK FORMAT AS SENT
  624. ;BY ANOTHER PERSON DOING "MODEM S FN.FT".
  625. ;
  626. RCVFIL    PROC    NEAR
  627. ;
  628. ; Turn off auto Xon/Xoff
  629. ;
  630.     Mov    Rxx,01h            ; Disable Rx Auto Xon
  631.     Mov    Txx,01h            ; Disable Tx Auto Xon
  632.     MOV    DX,OFFSET INIT_CCB    ; DS:DX points to control block
  633.     MOV    AX,4402H        ; IOCTL function program to default
  634.     MOV    BX,3            ; File handle for comms
  635.     INT    21H            ; Call MS-DOS
  636. ;
  637.           CALL    ERASFIL     ;ERASE THE FILE
  638.     CALL    MAKEFIL     ;..THEN MAKE NEW
  639.     MOV    AL,QFLG     ;SEE IF IN QUIET MODE
  640.     OR    AL,AL
  641.     JZ    L00019
  642.     JMP    RCVLP       ;NOT IN QUIET MODE, SKIP MSG
  643. L00019:    PUSH    BX
  644.     MOV    BX,OFFSET MSG01A
  645.     CALL    ILPRT       ;PRINT:
  646.     POP    BX
  647. RCVLP:    CALL    RCVSECT            ;GET A SECTOR
  648.     JAE    L00020
  649.     JMP    RCVEOT      ;GOT EOT
  650. L00020:    CALL    WRSECT      ;WRITE THE SECTOR
  651.     CALL    INCRSNO     ;BUMP SECTOR #
  652.     CALL    SENDACK     ;ACK THE SECTOR
  653.     JMP    RCVLP       ;LOOP UNTIL EOF
  654. ;
  655. ;GOT EOT ON SECTOR - FLUSH BUFFERS, END
  656. ;
  657. RCVEOT:    CALL    WRBLOCK     ;WRITE THE LAST BLOCK
  658.     CALL    SENDACK     ;ACK THE SECTOR
  659.     CALL    CLOSFIL     ;CLOSE THE FILE
  660. ;
  661. ;
  662. ; Turn on auto Xon/Xoff
  663. ;
  664.     Mov    Rxx,02h            ; Enable Rx Auto Xon
  665.     Mov    Txx,02h            ; Enable Tx Auto Xon
  666.     MOV    DX,OFFSET INIT_CCB    ; DS:DX points to control block
  667.     MOV    AX,4402H        ; IOCTL function program to default
  668.     MOV    BX,3            ; File handle for comms
  669.     INT    21H            ; Call MS-DOS
  670. ;
  671.     MOV    AL,QFLG     ;QUIET..
  672.     OR    AL,AL       ;..MODE?
  673.     JNZ    L00021
  674.     JMP    CKDIS       ;YES, CK DISCONN, END.
  675. L00021:    JMP    DONE        ;DISCONN IF REQ'D
  676. RCVFIL    ENDP
  677. ;
  678. ; * * * * * * * * * * * * * * * * * * * *
  679. ;                    *
  680. ;        SUBROUTINES        *
  681. ;                    *
  682. ; * * * * * * * * * * * * * * * * * * * *
  683. ;
  684. ;
  685. ;---->    RCVSECT: RECEIVE A SECTOR
  686. ;
  687. ;RETURNS WITH CARRY SET IF EOT RECEIVED.
  688. ;
  689. RCVSECT PROC    NEAR
  690.     XOR    AL,AL       ;GET 0
  691.     MOV        ERRCT,AL    ;INIT ERROR COUNT
  692. RCVRPT:    MOV    AL,QFLG     ;QUIET?
  693.     OR    AL,AL
  694.     JNZ    L00022
  695.     JMP    RCVSQ       ;YES, NO STAT MSG.
  696. L00022:    PUSH    BX
  697.     MOV    BX,OFFSET MSG02
  698.     CALL    ILPRT       ;PRINT:
  699.     POP    BX
  700.     MOV    AL,SECTNO    ;GET SECTOR #
  701.     INC    AL          ;(REAL INR LATER)
  702.     CALL    HEXO        ;PRINT IN HEX
  703.     CALL    CRLF        ;..THEN CRLF
  704. ;
  705. RCVSQ:    MOV    CH,10       ;10 SEC TIMEOUT
  706.     CALL    RECV        ;GET SOH/EOT
  707.     JAE    L00023
  708.     JMP    RCVSTOT     ;TIMEOUT
  709. L00023:    CMP    AL,SOH      ;GET SOH?
  710.     JNZ    L00024
  711.     JMP    RCVSOH      ;..YES
  712. ;
  713. ;EARLIER VERS. OF MODEM PROG SENT SOME NULLS -
  714. ;IGNORE THEM
  715. ;
  716. L00024:    OR    AL,AL       ;00 FROM SPEED CHECK?
  717.     JNZ    L00025
  718.     JMP    RCVSQ       ;YES, IGNORE IT
  719. L00025:    CMP    AL,EOT      ;END OF TRANSFER?
  720.     STC                 ;RETURN WITH CARRY..
  721.     JNZ    L00026
  722.     RET                 ;..SET IF EOT
  723. ;
  724. ;DIDN'T GET SOH  OR EOT - 
  725. ;
  726. L00026:    MOV    CH,AL       ;SAVE CHAR
  727.     MOV    AL,VSEEFLG    ;VIEWING..
  728.     OR    AL,AL       ;..MODE?
  729.     JNZ    L00027
  730.     JMP    RCVSEH      ;YES, PRT.MSG
  731. L00027:    MOV    AL,QFLG     ;QUIET..
  732.     OR    AL,AL       ;..MODE?
  733.     JNZ    RCVSEH 
  734.     JMP    RCVSERR     ;YES, SKIP MSG
  735. RCVSEH:    MOV    AL,CH       ;GET CHAR
  736.     CALL    HEXO        ;SHOW IN HEX
  737.     PUSH    BX
  738.     MOV    BX,OFFSET MSG03
  739.     CALL    ILPRT       ;PRINT:
  740.     POP    BX
  741. ;
  742. ;DIDN'T GET VALID HEADER - PURGE THE LINE,
  743. ;THEN SEND NAK.
  744. ;
  745. RCVSERR:
  746.     MOV    CH,1        ;WAIT FOR 1 SEC..
  747.     CALL    RECV        ;..WITH NO CHARS
  748.     JNAE    L00029
  749.     JMP    RCVSERR     ;LOOP UNTIL SENDER DONE
  750. L00029:    MOV    AL,NAK      ;SEND..
  751.     CALL    SEND        ;..THE NAK
  752.     MOV    AL,ERRCT    ;ABORT IF..
  753.     INC    AL          ;..WE HAVE REACHED..
  754.     MOV        ERRCT,AL    ;..THE ERROR..
  755.     CMP    AL,ERRLIM    ;..LIMIT?
  756.     JAE    L00030
  757.     JMP    RCVRPT      ;..NO, TRY AGAIN
  758. ;
  759. ;10 ERRORS IN A ROW - 
  760. ;
  761. L00030:    MOV    AL,VSEEFLG    ;VIEWING..
  762.     OR    AL,AL       ;..FILE?
  763.     JNZ    L00031
  764.     JMP    RCVCKQ      ;YES, ASK RETRY/QUIT
  765. L00031:    MOV    AL,QFLG     ;QUIET..
  766.     OR    AL,AL       ;..MODE?
  767.     JNZ    RCVCKQ 
  768.     JMP    RCVSABT     ;ABORT
  769. RCVCKQ:    CALL    CKQUIT      ;RETRY/QUIT?
  770.     JNZ    RCVSABT
  771.     JMP    RCVSECT     ;TRY AGAIN
  772. ;
  773. RCVSABT:
  774.     CALL    CLOSFIL     ;KEEP WHATEVER WE GOT
  775.     MOV    DX,OFFSET MSG20
  776.     CALL    ERXIT
  777. ;
  778. ;TIMEDOUT ON RECEIVE
  779. ;
  780. RCVSTOT:
  781.         STI
  782.     MOV    AL,VSEEFLG    ;VIEWING..
  783.     OR    AL,AL       ;..MODE?
  784.     JNZ    L00034
  785.     JMP    RCVSPT      ;YES, PRT MSG
  786. L00034:    MOV    AL,QFLG     ;QUIET..
  787.     OR    AL,AL       ;..MODE?
  788.     JNZ    RCVSPT 
  789.     JMP    RCVSERR     ;YES, NO MSG
  790. RCVSPT:    PUSH    BX
  791.     MOV    BX,OFFSET MSG03
  792.     CALL    ILPRT
  793.     POP    BX
  794. RCVPRN:    MOV    AL,ERRCT    ;PRINT ERROR..
  795.     CALL    HEXO        ;..COUNT
  796.     CALL    CRLF
  797.     JMP    RCVSERR     ;BUMP ERR CT, ETC.
  798. ;
  799. ;GOT SOH - GET BLOCK #, BLOCK # COMPLEMENTED
  800. ;
  801. RCVSOH:    MOV    CH,1        ;TIMEOUT = 1 SEC
  802.     CALL    RECV        ;GET SECTOR
  803.     JAE    L00036
  804.     JMP    RCVSTOT     ;GOT TIMEOUT
  805. L00036:    MOV    DH,AL       ;D=BLK #
  806.     MOV    CH,1        ;TIMEOUT = 1 SEC
  807.     CALL    RECV        ;GET CMA'D SECT #
  808.     JAE    L00037
  809.     JMP    RCVSTOT     ;TIMEOUT
  810. L00037:    NOT    AL          ;CALC COMPLEMENT
  811.     CMP    AL,DH       ;GOOD SECTOR #?
  812.     JNZ    L00038
  813.     JMP    RCVDATA     ;YES, GET DATA
  814. ;
  815. ;GOT BAD SECTOR #
  816. ;
  817. L00038:    MOV    AL,VSEEFLG    ;VIEWING..
  818.     OR    AL,AL       ;..MODE?
  819.     JNZ    L00039
  820.     JMP    RCVBSE      ;..YES, PRT MSG
  821. L00039:    MOV    AL,QFLG     ;QUIET..
  822.     OR    AL,AL       ;..MODE?
  823.     JNZ    RCVBSE 
  824.     JMP    RCVSERR     ;..YES, NO MSG
  825. ;
  826. RCVBSE:    PUSH    BX
  827.     MOV    BX,OFFSET MSG04
  828.     CALL    ILPRT       ;PRINT:
  829.     POP    BX
  830.     JMP    RCVSERR     ;BUMP ERROR CT.
  831. ;
  832. ;
  833. RCVDATA:
  834.     MOV    AL,DH       ;GET SECTOR #
  835.     MOV       RCVSNO,AL    ;SAVE IT
  836.     MOV    AL,1        ;SHOW..
  837.     MOV       DATAFLG,AL    ;GETTING DATA
  838.     MOV    CL,0        ;INIT CKSUM
  839.     MOV    BX,80H      ;POINT TO BUFFER
  840.     CLI
  841. RCVCHR:    MOV    CH,1        ;1 SEC TIMEOUT
  842.     CALL    RECV        ;GET CHAR
  843.     JAE    L00041
  844.     JMP    RCVSTOT     ;TIMEOUT
  845. L00041:    MOV    BYTE PTR [BX],AL ;STORE CHAR
  846.     INC    BL          ;DONE?
  847.     JZ    L00042
  848.     JMP    RCVCHR      ;NO, LOOP
  849. ;
  850. ;VERIFY CHECKSUM
  851. ;
  852. L00042:    MOV    DH,CL       ;SAVE CHECKSUM
  853.     XOR    AL,AL       ;SHOW..
  854.     MOV        DATAFLG,AL    ;..END OF DATA
  855.     MOV    CH,1        ;TIMEOUT LEN.
  856.     CALL    RECV        ;GET CHECKSUM
  857.     JAE    L00043
  858.     JMP    RCVSTOT     ;TIMEOUT
  859. L00043:    STI
  860.     CMP    AL,DH       ;CHECKSUM OK?
  861.     JZ    L00044
  862.     JMP    RCVCERR     ;NO, ERROR
  863. ;
  864. ;GOT A SECTOR, IT'S A DUP IF = PREV,
  865. ;    OR OK IF = 1 + PREV SECTOR
  866. ;
  867. L00044:    MOV    AL,RCVSNO    ;GET RECEIVED
  868.     MOV    CH,AL       ;SAVE IT
  869.     MOV    AL,SECTNO    ;GET PREV
  870.     CMP    AL,CH       ;PREV REPEATED?
  871.     JNZ    L00045
  872.     JMP    RECVACK     ;ACK TO CATCH UP
  873. L00045:    INC    AL          ;CALC NEXT SECTOR #
  874.     CMP    AL,CH       ;MATCH?
  875.     JZ    L00046
  876.     JMP    ABORT       ;NO MATCH - STOP SENDER, EXIT
  877. L00046:    RET                 ;CARRY OFF - NO ERRORS
  878. ;
  879. ;GOT CKSUM
  880. ;
  881. RCVCERR:
  882.     MOV    AL,VSEEFLG    ;VIEWING..
  883.     OR    AL,AL       ;..MODE?
  884.     JNZ    L00047
  885.     JMP    RCVCPR      ;..YES, PRT MSG
  886. L00047:    MOV    AL,QFLG     ;QUIET..
  887.     OR    AL,AL       ;..MODE?
  888.     JNZ    RCVCPR 
  889.     JMP    RCVSERR     ;YES, NO MSG
  890. RCVCPR:    PUSH    BX
  891.     MOV    BX,OFFSET MSG05
  892.     CALL    ILPRT
  893.     POP    BX
  894.     JMP    RCVPRN      ;PRINT ERROR #
  895. ;
  896. ;PREV SECT REPEATED, DUE TO THE LAST ACK
  897. ;BEING GARBAGED.  ACK IT SO SENDER WILL CATCH UP 
  898. ;
  899. RECVACK:
  900.     CALL    SENDACK     ;SEND THE ACK,
  901.     JMP    RCVSECT     ;GET NEXT BLOCK
  902. ;
  903. ;SEND AN ACK FOR THE SECTOR
  904. ;
  905. SENDACK:
  906.     MOV    AL,ACK      ;GET ACK
  907.     CALL    SEND        ;..AND SEND IT
  908.     RET
  909. RCVSECT ENDP
  910. ;
  911. ;---->    SENDHDR: SEND THE SECTOR HEADER
  912. ;
  913. ;SEND: (SOH) (BLOCK #) (COMPLEMENTED BLOCK #)
  914. ;
  915. SENDHDR PROC    NEAR
  916.     MOV    AL,QFLG     ;QUIET..
  917.     OR    AL,AL       ;..MODE?
  918.     JNZ    L00049
  919.     JMP    SENDHNM     ;YES, SKIP STATUS MSG.
  920. L00049:    PUSH    BX
  921.     MOV    BX,OFFSET MSG06
  922.     CALL    ILPRT       ;PRINT:
  923.     POP    BX
  924.     MOV    AL,SECTNO    ;PRINT..
  925.     CALL    HEXO        ;..SECT #
  926.     CALL    CRLF        ;..THEN CR/LF
  927. ;
  928. SENDHNM:
  929.         MOV    AL,SOH      ;SEND..
  930.     CALL    SEND        ;..SOH,
  931.     MOV    AL,SECTNO    ;THEN SEND..
  932.     CALL    SEND        ;..SECTOR #
  933.     MOV    AL,SECTNO    ;THEN SENDOR #
  934.     NOT    AL          ;..COMPLEMENTED..
  935.     CALL    SEND        ;..SECTOR #
  936.     RET                 ;FROM SENDHDR
  937. SENDHDR ENDP
  938. ;
  939. ;---->    SENDSEC: SEND THE DATA SECTOR
  940. ;
  941. ;WHILE SENDING THE SECTOR, THE "DATAFLG" IS SET
  942. ;SUCH THAT IF "V" (VIEW THE FILE) WAS REQUESTED,
  943. ;THE "SHOW" ROUTINE WILL PRINT THE DATA, BUT NOT
  944. ;THE HDR OR CKSUM, OR ANY NON-FATAL MSGS.
  945. ;
  946. SENDSEC PROC    NEAR
  947.     MOV    AL,1        ;SHOW NOW AT DATA..
  948.     MOV        DATAFLG,AL    ;..FOR VIEW COMMAND
  949.     MOV    CL,0        ;INIT CKSUM
  950.     MOV    BX,80H      ;POINT TO BUFFER
  951. SENDC:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  952.     CALL    SEND        ;SEND IT
  953.     INC    BL          ;POINT TO NEXT CHAR
  954.     JZ    L00050
  955.     JMP    SENDC       ;LOOP IF <100H
  956. L00050:    XOR    AL,AL       ;SHOW NOT INTO DATA..
  957.     MOV       DATAFLG,AL    ;..FOR VIEW COMMAND
  958.     RET                 ;FROM SENDSEC
  959. SENDSEC ENDP
  960. ;
  961. ;---->    SENDCKS: SEND THE CHECKSUM
  962. ;
  963. SENDCKS PROC    NEAR
  964.     MOV    AL,CL       ;SEND THE..
  965.     CALL    SEND        ;..CHECKSUM
  966.     RET                 ;FROM SENDCKS
  967. SENDCKS    ENDP
  968. ;
  969. ;---->    GETACK: GET THE ACK ON THE SECTOR
  970. ;
  971. ;RETURNS WITH CARRY CLEAR IF ACK RECEIVED.
  972. ;IF AN ACK IS NOT RECEIVED, THE ERROR COUNT
  973. ;IS INCREMENTED, AND IF LESS THAN "ERRLIM",
  974. ;CARRY IS SET AND CONTROL RETURNS.  IF THE
  975. ;ERROR COUNT IS AT "ERRLIM", THE PROGRAM
  976. ;ABORTS IF IN "QUIET" MODE, OR ASKS THE
  977. ;USER FOR QUIT/RETRY IF NOT.
  978. ;
  979. GETACK  PROC    NEAR
  980.            MOV    CH,10       ;WAIT 10 SECONDS MAX
  981.     CALL    RECVDG      ;RECV W/GARBAGE COLLECT
  982.     JAE    L00051
  983.     JMP    GESATOT     ;TIMED OUT
  984. L00051:    CMP    AL,ACK      ;OK? (CARRY OFF IF =)
  985.     JNZ    L00052
  986.     RET                 ;YES, RET FROM GETACK
  987. ;
  988. L00052  LABEL   NEAR
  989.         IF      CANFLG
  990.     CMP    AL,CAN      ;CANCEL TRANSMISSION?
  991.     JNZ    L00053
  992.     JMP    ABORT       ;..YES
  993. L00053  LABEL    NEAR
  994.     ENDIF
  995. ;
  996.     MOV    CH,AL       ;SAVE CHAR
  997.     MOV    AL,QFLG     ;QUIET..
  998.     OR    AL,AL       ;..MODE?
  999.     JNZ    L00054
  1000.     JMP    ACKERR      ;..YES, NO MSG
  1001. L00054:    MOV    AL,CH       ;GET CHAR
  1002.     CALL    HEXO        ;PRINT IN HEX
  1003.     PUSH    BX
  1004.     MOV    BX,OFFSET MSG07
  1005.     CALL    ILPRT       ;PRINT:
  1006.     POP    BX
  1007. ;
  1008. ;TIMEOUT OR ERROR ON ACK - BUMP ERROR COUNT
  1009. ;
  1010. ACKERR:    MOV    AL,ERRCT    ;GET COUNT
  1011.     INC    AL          ;BUMP IT
  1012.     MOV        ERRCT,AL    ;SAVE BACK
  1013.     CMP    AL,ERRLIM    ;AT LIMIT?
  1014.     JNB    L00055
  1015.     RET                 ;NOT AT LIMIT
  1016. ;
  1017. ;REACHED ERROR LIMIT
  1018. ;
  1019. L00055:    MOV    AL,VSEEFLG    ;VIEWING..
  1020.     OR    AL,AL       ;..FILE?
  1021.     JNZ    L00056
  1022.     JMP    GACKV       ;YES, ASK QUIT/RETRY
  1023. L00056:    MOV    AL,QFLG     ;QUIET..
  1024.     OR    AL,AL       ;..MODE?
  1025.     JNZ    GACKV
  1026.     JMP    CSABORT     ;..YES, NO MCG
  1027. GACKV:    CALL    CKQUIT      ;SEE IF WANT TO QUIT
  1028.     STC                 ;TO SHOW NO ACK
  1029.     JNZ    CSABORT
  1030.     RET                 ;KEEP ON TRYIN'
  1031. CSABORT:
  1032.     MOV    DX,OFFSET MSG21
  1033.     CALL    ERXIT
  1034. GETACK    ENDP
  1035. ;
  1036. ;TIMEOUT GETTING ACK
  1037. ;
  1038. GESATOT PROC    NEAR
  1039.     MOV    AL,QFLG     ;QUIET..
  1040.     OR    AL,AL       ;..MODE?
  1041.     JNZ    L00059
  1042.     JMP    ACKERR      ;YES, NO MSG
  1043. L00059:    PUSH    BX
  1044.     MOV    BX,OFFSET MSG08
  1045.     CALL    ILPRT       ;PRINT:
  1046.      POP    BX
  1047.     JMP    ACKERR
  1048. GESATOT    ENDP
  1049. ;---->    CKABORT: CHECK FOR LOCAL ABORT
  1050. ;
  1051. ;IF THE USER WANTS TO CANCEL THE TRANSMISSION,
  1052. ;TYPING CTL-X WILL ABORT IT.  NOTE THIS TEST
  1053. ;IS NOT MADE IF IN QUIET (NO CONSOLE I/O) MODE.
  1054. ;
  1055. CKABORT PROC    NEAR
  1056.     MOV    AL,VSEEFLG    ;VIEWING?
  1057.     OR    AL,AL
  1058.     JNZ    L00060
  1059.     JMP    CKABGO      ;YES, CHECK
  1060. L00060: MOV    AL,QFLG        ;SUPPRESSED..
  1061.     OR    AL,AL       ;..CONSOLE I/O?
  1062.     JNZ    L00061
  1063.     RET                 ;YES, NO TEST
  1064. ;
  1065. L00061  LABEL    NEAR
  1066.     IF NOT CANFLG
  1067.     RET
  1068.     ENDIF
  1069. ;
  1070. CKABGO:    CALL    STAT        ;KEY PRESSED?
  1071.     JNZ    L00062
  1072.     RET                 ;NOTHING FROM KEYBOARD
  1073. L00062:    CALL    KEYIN       ;GET DATA
  1074.     CMP    AL,EXITCHR    ;TIME TO END?
  1075.     JZ    ABORT  
  1076.     RET                 ;NO, CONTINUE
  1077. ABORT:    NOP            ;LEA    SP,STACK
  1078. ABORTL:    MOV    CH,1        ;1 SEC. W/O CHARS.
  1079.     CALL    RECV
  1080.     JNAE    L00064
  1081.     JMP    ABORTL      ;LOOP UNTIL SENDER DONE
  1082. L00064:    MOV    AL,CAN      ;CONTROL X
  1083.     CALL    SEND        ;STOP SENDING END
  1084. ABORTW:    MOV    CH,1        ;1 SEC W/O CHARS.
  1085.     CALL    RECV
  1086.     JNAE    L00065
  1087.     JMP    ABORTW      ;LOOP UNTIL SENDER DONE
  1088. L00065:    MOV    AL,' '      ;GET A SPACE...
  1089.     CALL    SEND        ;TO CLEAR OUT CONTROL X
  1090.     PUSH    BX
  1091.     MOV    BX,OFFSET MSG09
  1092.     CALL    ILPRT       ;EXIT WITH ABORT MSG
  1093.     POP    BX
  1094.     JMP    CKDIS       ;CHECK FOR DISCONN.
  1095. CKABORT ENDP
  1096. ;
  1097. ;---->    INCRSNO: INCREMENT SECTOR #
  1098. ;
  1099. INCRSNO PROC    NEAR
  1100.     MOV    AL,SECTNO    ;INCR..
  1101.     INC    AL          ;..SECT..
  1102.     MOV        SECTNO,AL    ;..NUMBER
  1103.     RET
  1104. INCRSNO ENDP
  1105. ;
  1106. ;---->    ERASFIL: ERASE THE INCOMING FILE.
  1107. ;
  1108. ;IF IT EXISTS, ASK IF IT MAY BE ERASED.
  1109. ;
  1110. ERASFIL PROC     NEAR
  1111.     MOV    DX,OFFSET FCB      ;POINT TO CTL BLOCK
  1112.     MOV    CL,SRCHF    ;SEE IF IT..
  1113.     CALL    BDOS        ;..EXISTS
  1114.     INC    AL          ;FOUND?
  1115.     JNZ    L00066
  1116.     RET                 ;..NO, RETURN
  1117. L00066:    PUSH    BX
  1118.     MOV    BX,OFFSET MSG10
  1119.     CALL    ILPRT       ;PRINT:
  1120.     POP    BX
  1121.     CALL    KEYIN       ;GET CHAR
  1122.     LAHF
  1123.     XCHG    AL,AH
  1124.     PUSH    AX
  1125.     XCHG    AL,AH
  1126.     CALL    TYPEZZ      ;ECHO
  1127.     POP    AX
  1128.     XCHG    AL,AH
  1129.     SAHF    
  1130.     AND    AL,5FH      ;MAKE UPPER CASE
  1131.     CMP    AL,'Y'      ;WANT ERASED?
  1132.     JZ    L00067
  1133.     JMP    CKDIS       ;QUIT IF NOT ERASE
  1134. L00067:    CALL    CRLF        ;BACK TO START OF LINE
  1135. ;
  1136. ;ERASE OLD FILE
  1137. ;
  1138.     MOV    DX,OFFSET FCB      ;POINT TO FCB
  1139.     MOV    CL,ERASE    ;GET BDOS FNC
  1140.     CALL    BDOS        ;DO THE ERASE
  1141.     RET                 ;FROM "ERASFIL"
  1142. ERASFIL    ENDP
  1143. ;
  1144. ;---->    MAKEFIL: MAKES THE FILE TO BE RECEIVED
  1145. ;
  1146. MAKEFIL PROC    NEAR
  1147.     MOV    DX,OFFSET FCB      ;POINT TO FCB
  1148.     MOV    CL,MAKE     ;GET BDOS FNC
  1149.     CALL    BDOS        ;TO THE MAKE
  1150.     INC    AL          ;FF=BAD?
  1151.     JZ    L00068
  1152.     RET                 ;OPEN OK
  1153. ;DIRECTORY FULL - CAN'T MAKE FILE
  1154. L00068:    MOV    DX,OFFSET MSG22
  1155.     CALL    ERXIT
  1156. MAKEFIL    ENDP
  1157. ;
  1158. ;---->    OPENFIL: OPENS THE FILE TO BE SENT
  1159. ;
  1160. OPENFIL PROC    NEAR
  1161.     MOV    DX,OFFSET FCB      ;POINT TO FILE
  1162.     MOV    CL,OPEN     ;GET FUNCTION
  1163.     CALL    BDOS        ;OPEN IT
  1164.     INC    AL          ;OPEN OK?
  1165.     JZ    L00069
  1166.     JMP    OPENOK      ;..YES
  1167. L00069:    PUSH    DX
  1168.     MOV    DX,OFFSET MSG11
  1169.     CALL    ERXIT       ;..NO, ABORT
  1170.     POP    DX
  1171. ;
  1172. OPENOK:
  1173.     PUSH    BX
  1174.     MOV    BX,OFFSET MSG12
  1175.     CALL    ILPRT       ;PRINT:
  1176.     POP    BX
  1177.     MOV    AL,FCBSZH    ;GET FILE SIZE HIGH ORDER
  1178.     CALL    HEXO        ;PRINT IN HEX
  1179.     MOV    AL,FCBSZL    ;GET FILE SIZE LOW ORDER
  1180.     CALL    HEXO        ;PRINT IN HEX
  1181.     MOV    AL,'H'
  1182.     CALL    TYPEZZ      ;PRINT 'H' AFTER NUMBER
  1183.     CALL    CRLF        ;..THEN CRLF
  1184.     RET
  1185. OPENFIL ENDP
  1186. ;
  1187. ;---->    CLOSFIL: CLOSES THE RECEIVED FILE
  1188. ;
  1189. CLOSFIL PROC    NEAR
  1190.     MOV    DX,OFFSET FCB      ;POINT TO FILE
  1191.     MOV    CL,CLOSE    ;GET FUNCTION
  1192.     CALL    BDOS        ;CLOSE IT
  1193.     INC    AL          ;CLOSE OK?
  1194.     JZ    L00070
  1195.     RET                 ;..YES, RETURN
  1196. L00070:    MOV    DX,OFFSET MSG22A
  1197.     CALL    ERXIT       ;..NO, ABORT
  1198. CLOSFIL ENDP
  1199. ;
  1200. ;---->    RDSECT: READS A SECTOR
  1201. ;
  1202. ;FOR SPEED, THIS ROUTINE BUFFERS UP 16
  1203. ;SECTORS AT A TIME.
  1204. ;
  1205. RDSECT  PROC    NEAR
  1206.            MOV    AL,SECINBF    ;GET # SECT IN BUFF.
  1207.     DEC    AL          ;DECREMENT..
  1208.     MOV        SECINBF,AL    ;..IT
  1209.     JNS    L00071
  1210.     JMP    RDBLOCK     ;EXHAUSTED?  NEED MORE.
  1211. L00071:    MOV    BX,SECPTR    ;GET POINTER
  1212.     MOV    DX,80H      ;TO DATA 
  1213.     CALL    MOVE128     ;MOVE TO BUFFER
  1214.     MOV    SECPTR,BX    ;SAVE BUFFER POINTER
  1215.     RET                 ;FROM "READSEC"
  1216. ;
  1217. ;BUFFER IS EMPTY - READ IN ANOTHER BLOCK OF 16
  1218. ;
  1219. RDBLOCK LABEL    NEAR
  1220.     MOV    AL,EOFLG    ;GET EOF FLAG
  1221.     CMP    AL,1        ;IS IT SET/
  1222.     STC                 ;TO SHOW EOF
  1223.     JNZ    L00072
  1224.     RET                 ;GOT EOF
  1225. L00072:    MOV    CL,0        ;SECTORS IN BLOCK
  1226.     LEA    DX,DBUF     ;TO DISK BUFFER
  1227. RDSECLP LABEL    NEAR
  1228.     PUSH    CX
  1229.     PUSH    DX
  1230.     MOV    CL,STDMA    ;SET DMA..
  1231.     CALL    BDOS        ;..ADDR
  1232.     MOV    DX,OFFSET FCB
  1233.     MOV    CL,READ
  1234.     CALL    BDOS
  1235.     POP    DX
  1236.     POP    CX
  1237.     OR    AL,AL       ;READ OK?
  1238.     JNZ    L00073
  1239.     JMP    RDSECOK     ;YES
  1240. L00073:    DEC    AL          ;EOF?
  1241.     JZ    REOF        ; 1 = EOF (regular)
  1242.     DEC    AL
  1243.     JZ    L00074        ; 2 = ERROR (trans area too small)
  1244.     DEC    AL
  1245.     JZ    RDSECOK        ; 3 = EOF (partial block)
  1246. ; ALL OTHER RETURNS CONSIDERED ERROR !!!
  1247. ;
  1248. ;READ ERROR
  1249. ;
  1250. L00074:    MOV    DX,OFFSET MSG23
  1251.     CALL    ERXIT
  1252. ;
  1253. RDSECOK:
  1254.     MOV    BX,80H
  1255.     PUSH    SI
  1256.     PUSHF
  1257.     ADD    BX,DX
  1258.     RCR    SI,1
  1259.     POPF
  1260.     RCL    SI,1
  1261.     POP    SI          ;TO NEXT BUFF
  1262.     XCHG    BX,DX       ;BUFF TO DE
  1263.     INC    CL          ;MORE SECTORS?
  1264.     MOV    AL,CL       ;GET COUNT
  1265.     CMP    AL,16       ;DONE?
  1266.     JNZ    L00075
  1267.     JMP    RDBFULL     ;..YES, BUFF IS FULL
  1268. L00075:    JMP    RDSECLP     ;READ MORE
  1269. ;
  1270. REOF:    MOV    AL,1
  1271.     MOV        EOFLG,AL    ;SET EOF FLAG
  1272.     MOV    AL,CL
  1273. ;
  1274. ;BUFFER IS FULL, OR GOT EOF
  1275. ;
  1276. RDBFULL:
  1277.     MOV    SECINBF,AL    ;STORE SECTOR COUNT
  1278.     MOV    BX,OFFSET DBUF    ;INIT BUFFER..
  1279.     MOV    SECPTR,BX    ;..POINTER
  1280.     MOV    DX,80H      ;RESET..
  1281.     MOV    CL,STDMA    ;..DMA..
  1282.     CALL    BDOS        ;..ADDR
  1283.     JMP    RDSECT      ;PASS SECT TO CALLER
  1284. RDSECT    ENDP
  1285. ;
  1286. ;---->    WRSECT: WRITE A SECTOR
  1287. ;
  1288. ;WRITES THE SECTOR INTO A BUFFER.  WHEN 16
  1289. ;HAVE BEEN WRITTEN, WRITES THE BLOCK TO DISK.
  1290. ;
  1291. ;ENTRY POINT "WRBLOCK" FLUSHES THE BUFFER AT EOF.
  1292. ;
  1293. WRSECT  PROC    NEAR
  1294.            MOV    BX,SECPTR    ;GET BUFF ADDR
  1295.     XCHG    BX,DX       ;TO DE FOR MOVE
  1296.     MOV    BX,80H      ;FROM HERE
  1297.     CALL    MOVE128     ;MOVE TO BUFFER
  1298.     XCHG    BX,DX       ;SAVE NEXT..
  1299.     MOV    SECPTR,BX    ;..BLOCK POINTER
  1300.     MOV    AL,SECINBF    ;BUMP THE..
  1301.     INC    AL          ;..SECTOR #..
  1302.     MOV        SECINBF,AL    ;..IN THE BUFF
  1303.     CMP    AL,16       ;HAVE WE 16?
  1304.     JZ    WRBLOCK
  1305.     RET                 ;NO, RETURN
  1306. ;
  1307. ;---->    WRBLOCK: WRITES A BLOCK TO DISK
  1308. ;
  1309. WRBLOCK:
  1310.      MOV    AL,SECINBF    ;# SECT IN BUFFER
  1311.     OR    AL,AL       ;0 MEANS END OF FILE
  1312.     JNZ    L00077
  1313.     RET                 ;NONE TO WRITE
  1314. L00077:    MOV    CL,AL       ;SAVE COUNT
  1315.     LEA    DX,DBUF     ;POINT TO DISK BUFF
  1316. DKWRLP:    PUSH    BX
  1317.     PUSH    DX
  1318.     PUSH    CX
  1319.     MOV    CL,STDMA    ;SET DMA
  1320.     CALL    BDOS        ;TO BUFFER
  1321.     MOV    DX,OFFSET FCB      ;THEN WRITE
  1322.     MOV    CL,WRITE    ;..THE..
  1323.     CALL    BDOS        ;..BLOCK
  1324.     POP    CX
  1325.     POP    DX
  1326.     POP    BX
  1327.     OR    AL,AL
  1328.     JZ    L00078
  1329.     JMP    WRERR       ;OOPS, ERROR
  1330. L00078:    MOV    BX,80H      ;LENGTH OF 1 SECT
  1331.     PUSH    SI
  1332.     PUSHF
  1333.     ADD    BX,DX
  1334.     RCR    SI,1
  1335.     POPF
  1336.     RCL    SI,1
  1337.     POP    SI          ;HL= NEXT BUFF
  1338.     XCHG    BX,DX       ;TO DE FOR SETDMA
  1339.     DEC    CL          ;MORE SECTORS?
  1340.       JZ    L00079
  1341.     JMP    DKWRLP      ;..YES, LOOP
  1342. L00079:    XOR    AL,AL       ;GET A ZERO
  1343.     MOV       SECINBF,AL    ;RESET # OF SECTORS
  1344.     MOV    BX,OFFSET DBUF    ;RESET BUFFER..
  1345.     MOV    SECPTR,BX    ;..POINTER
  1346. ;
  1347.     MOV    DX,80H      ;07/13/79 MOD..
  1348.     MOV    CL,STDMA    ;..TO RESET..
  1349.     CALL    BDOS        ;..DMA ADDR.
  1350. ;
  1351.     RET
  1352. ;
  1353. WRERR:    MOV    CL,CAN      ;CANCEL..
  1354.     CALL    SEND        ;..SENDER
  1355.     MOV    DX,OFFSET MSG24
  1356.     CALL    ERXIT       ;EXIT W/MSG:
  1357. WRSECT  ENDP
  1358. ;
  1359. ;---->    RECV: RECEIVE A CHARACTER
  1360. ;
  1361. ;TIMEOUT TIME IS IN B, IN SECONDS.  ENTRY VIA
  1362. ;"RECVDG" DELETES GARBAGE CHARACTERS ON THE
  1363. ;LINE.  FOR EXAMPLE, HAVING JUST SENT A SECTOR,
  1364. ;CALLING RECVDG WILL DELETE ANY LINE-NOISE-INDUCED
  1365. ;CHARACTERS "LONG" BEFORE THE ACK/NAK WOULD
  1366. ;BE RECEIVED.
  1367. ;
  1368. RECCHAR PROC    NEAR
  1369. RECVDG    LABEL    NEAR        ;RECEIVE W/GARBAGE DELETE
  1370. RECV:    PUSH    DX          ;SAVE
  1371. ;
  1372.     IF    FASTCLK     ;4MHZ?
  1373.     MOV    AL,CH       ;GET TIME REQUEST
  1374.     ADD    AL,AL       ;DOUBLE IT
  1375.     MOV    CH,AL       ;NEW TIME IN B
  1376.     ENDIF
  1377. ;
  1378. MSEC:    MOV    DX,200h        ;1 SEC DCR COUNT
  1379.     CALL    CKABORT     ;CHECK FOR EXIT REQUEST
  1380. MWTI:    Call    Statit        ; Get status
  1381.     Or    Al,Al        ; Character Available?
  1382.     JZ    L00080
  1383.     JMP    MCHAR       ;GOT CHAR
  1384. L00080:    DEC    DL          ;COUNT..
  1385.     JZ    L00081
  1386.     JMP    MWTI        ;..DOWN..
  1387. L00081:    DEC    DH          ;..FOR..
  1388.     JZ    L00082
  1389.     JMP    MWTI        ;..TIMEOUT
  1390. L00082:    DEC    CH          ;MORE SECONDS?
  1391.     JZ    L00083
  1392.     JMP    MSEC        ;YES, WAIT
  1393. ;
  1394. ;MODEM TIMED OUT RECEIVING
  1395. ;
  1396. L00083:    POP    DX          ;RESTORE D,E
  1397.     STC                 ;CARRY SHOWS TIMEOUT
  1398.     RET
  1399. ;
  1400. ;GOT CHAR FROM MODEM
  1401. ;
  1402. MCHAR:    Call    Getit        ; Get character
  1403.     POP    DX          ;RESTORE DE
  1404. ;
  1405. ;CALC CHECKSUM
  1406. ;
  1407.     LAHF
  1408.     XCHG    AL,AH
  1409.     PUSH    AX
  1410.     XCHG    AL,AH       ;SAVE THE CHAR
  1411.     ADD    AL,CL       ;ADD TO CHECKSUM
  1412.     MOV    CL,AL       ;SAVE CHECKSUM
  1413. ;
  1414. ;CHECK IF MONITORING REC'D DATA
  1415. ;
  1416.     MOV    AL,RSEEFLG    ;SEE RECEIVED..
  1417.     OR    AL,AL       ;..DATA?
  1418.     JNZ    L00084
  1419.     JMP    MONIN       ;..YES
  1420. ;
  1421. ;CHECK IF "VIEWING" AND THIS IS A DATA CHAR
  1422. ;
  1423. L00084:    MOV    AL,VSEEFLG    ;VIEWING..
  1424.     OR    AL,AL       ;..DATA?
  1425.     JZ    L00085
  1426.     JMP    NOMONIN     ;..NO
  1427. ;
  1428. ;"VIEW" REQUESTED.  SHOW THE CHAR IT IS DATA
  1429. ;
  1430. L00085:    MOV    AL,DATAFLG    ;GET DATA FLAG
  1431.     OR    AL,AL       ;TEST IT
  1432.     JNZ    MONIN  
  1433.     JMP    NOMONIN     ;..OFF, NOT DATA
  1434. MONIN:    POP    AX
  1435.     XCHG    AL,AH
  1436.     SAHF                ;..IS DATA,
  1437.     LAHF
  1438.     XCHG    AL,AH
  1439.     PUSH    AX
  1440.     XCHG    AL,AH       ;GET IT,
  1441.     CALL    SHOW        ;..AND SHOW IT
  1442. NOMONIN:
  1443.     POP    AX
  1444.     XCHG    AL,AH
  1445.     SAHF                ;RESTORE CHAR
  1446.     OR    AL,AL       ;CARRY OFF: NO ERROR
  1447.     RET                 ;FROM "RECV"
  1448. RECCHAR    ENDP
  1449. ;
  1450. ;---->    SEND: SEND A CHARACTER TO THE MODEM
  1451. ;
  1452. SEND    PROC    NEAR
  1453.          LAHF
  1454.     XCHG    AL,AH
  1455.     PUSH    AX
  1456.     XCHG    AL,AH       ;SAVE THE CHAR
  1457. ;
  1458. ;CHECK IF MONITORING SENT DATA
  1459. ;
  1460.     MOV    AL,SSEEFLG    ;CHECK IF MONITORING..
  1461.     OR    AL,AL       ;..SENT DATA
  1462.     JNZ    L00087
  1463.     JMP    MONOUT      ;..YES
  1464. ;
  1465. ;CHECK IF "VIEWING" THE FILE
  1466. ;
  1467. L00087:    MOV    AL,VSEEFLG    ;GET VIEW FLAG
  1468.     OR    AL,AL       ;TEST IT
  1469.     JZ    L00088
  1470.     JMP    NOMONOT     ;NO
  1471. L00088:    MOV    AL,DATAFLG    ;IS THIS
  1472.     OR    AL,AL       ;..DATA?
  1473.     JNZ    MONOUT 
  1474.     JMP    NOMONOT     ;..NO.
  1475. MONOUT:    POP    AX
  1476.     XCHG    AL,AH
  1477.     SAHF                ;GET THE CHAR
  1478.     LAHF
  1479.     XCHG    AL,AH
  1480.     PUSH    AX
  1481.     XCHG    AL,AH       ;SAVE IT
  1482.     CALL    SHOW        ;SHOW IT
  1483. NOMONOT:
  1484.         POP    AX
  1485.     XCHG    AL,AH
  1486.     SAHF                ;RESTORE CHAR
  1487.     LAHF
  1488.     XCHG    AL,AH
  1489.     PUSH    AX
  1490.     XCHG    AL,AH       ;SAVE IT
  1491.     ADD    AL,CL       ;CALC CKSUM
  1492.     MOV    CL,AL       ;SAVE CKSUM
  1493.     Pop    Ax
  1494.     Xchg    Al,Ah
  1495.     Sahf
  1496. Sendl:    Call    Sendit        ;Send character
  1497.     Or    Ah,Ah        ;Was character sent
  1498.     Jz    Sendl        ;If not, try again!
  1499.     RET                 ;FROM "SEND"
  1500. SEND    ENDP
  1501. ;
  1502. ;---->    WAITNAK: WAITS FOR INITIAL NAK
  1503. ;
  1504. ;TO ENSURE NO DATA IS SENT UNTIL THE RECEIVING
  1505. ;PROGRAM IS READY, THIS ROUTINE WAITS FOR THE
  1506. ;THE FIRST TIMEOUT-NAK FROM THE RECEIVER.  (E)
  1507. ;CONTAINS THE # OF SECONDS TO WAIT.
  1508. ;
  1509. WAITNAK PROC    NEAR
  1510.     MOV    AL,VSEEFLG    ;VIEWING?
  1511.     OR    AL,AL
  1512.     JNZ    L00091
  1513.     JMP    WAITNPR     ;PRINT MSG
  1514. L00091:    MOV    AL,QFLG     ;QUIET..
  1515.     OR    AL,AL       ;..MODE?
  1516.     JNZ    WAITNPR
  1517.     JMP    WAITNLP     ;YES, SKIP MSG
  1518. WAITNPR LABEL    NEAR
  1519.     PUSH    BX
  1520.     MOV    BX,OFFSET MSG13
  1521.     CALL    ILPRT       ;PRINT:
  1522.     POP    BX
  1523. WAITNLP LABEL    NEAR
  1524.     CALL    CKABORT     ;ABORT IF LOCAL CTL-X
  1525.     MOV    CH,1        ;TIMEOUT DELAY
  1526.     CALL    RECV        ;DID WE GET..
  1527.     CMP    AL,NAK      ;..A NAK?
  1528.     JNZ    L00093
  1529.     RET                 ;YES, SEND BLOCK
  1530. ;
  1531. L00093  LABEL    NEAR
  1532.     IF CANFLG
  1533.     CMP    AL,CAN      ;CTL-X FROM REMOTE?
  1534.     JNZ    L00094
  1535.     JMP    ABORT       ;..YES, ABORT
  1536. L00094  LABEL    NEAR
  1537.     ENDIF
  1538. ;
  1539.     DEC    DL          ;80 TRIES?
  1540.     JNZ    L00095
  1541.     JMP    ABORT       ;YES, ABORT
  1542. L00095:    JMP    WAITNLP     ;NO, LOOP
  1543. WAITNAK    ENDP
  1544. ;
  1545. ;
  1546. ;---->    PROCOPT: PROCESS COMMAND OPTIONS
  1547. ;1) SAVES THE PRIMARY OPTION IN 'OPTION';
  1548. ;2) IF OPTION 'H' (HELP) IS ASKED FOR,
  1549. ;TRANSFERS DIRECTLY TO THE HELP PRINT;
  1550. ;3) SCANS THE SUB-OPTION CHARACTERS, AND FOR
  1551. ;EACH FOUND, ZEROS THE APPROPRIATE ENTRY IN
  1552. ;THE OPTION TABLE.  FOR EXAMPLE, IF 'D' IS 
  1553. ;CODED (DISCONNECT) THEN THE 'D' STORED AT
  1554. ;'DISCFLG' IS SET TO 0 SO IT CAN BE TESTED
  1555. ;LATER.
  1556. ;
  1557. PROCOPT PROC    NEAR
  1558.         MOV    DX,OFFSET FCBNAME ;TO PRIMARY OPT.
  1559.     XCHG    BX,DX
  1560.     MOV    AL,ES:[BX]      ;GET PRIMARY OPT.
  1561.        XCHG    BX,DX                   
  1562.     MOV       OPTION,AL    ;SAVE IT
  1563.         CMP     AL,'X'        ;MODEM EXAMPLES?
  1564.         JNZ    L00096
  1565.     JMP    EXAM        ;..YES, GIVE EXAMPLES
  1566. L00096:    CMP    AL,'H'      ;MODEM H(ELP)?
  1567.     JNZ    OPTLP  
  1568.     JMP    HELP        ;..YES, GIVE HELP
  1569. OPTLP:    PUSHF
  1570.     INC    DX              ;TO SECONDARY OPTION
  1571.     POPF                                    
  1572.     XCHG    BX,DX
  1573.     MOV    AL,ES:[BX]      ;GET CHAR
  1574.     XCHG    BX,DX                  
  1575. ;
  1576. ;IF YOU MOD THIS PROGRAM FOR >7 OPTIONS,
  1577. ;YOU MUST CHANGE THE FOLLOWING, SINCE
  1578. ;THERE WON'T BE A ' ' AFTER THE OPTION
  1579. ;IF A BAUD RATE WAS SPECIFIED.
  1580. ;
  1581.     CMP    AL,' '      ;NO MORE OPT'NS?
  1582.     JNZ    L00097
  1583.     JMP    ENDOPT      ;..YES
  1584. ;SET THE APPROP. OPT: STORE 0 IN IT
  1585. L00097:    MOV    BX,OFFSET OPTBL        ;HL = ADDR OF 'OAQDSRV'
  1586.     MOV    CX,TABLESIZE        ;OPT TABLE LEN
  1587. OPTCK:    CMP    AL,BYTE PTR [BX] ;FOUND THE OPTION?
  1588.     JZ    L00098
  1589.     JMP    OPTNO       ;NO, DON'T SET IT
  1590. L00098:    MOV    BYTE PTR [BX],0    ;SET THE OPTION
  1591.     JMP    OPTLP       ;GET NEXT OPTION
  1592. OPTNO:    PUSHF
  1593.     INC    BX
  1594.     POPF                ;TO NEXT
  1595.     DEC    CX          ;MORE?
  1596.     JZ    L00099
  1597.     JMP    OPTCK
  1598. ;OPTION NOT IN TABLE
  1599. L00099:    JMP    BADOPT      ;SHOW BAD SUB OPTION
  1600. ;
  1601. ENDOPT:    Mov    Bx,Offset FCBEXT    ; Get address of extentsion
  1602.     MOV    AL,ES:[BX]          ;GET CHAR
  1603.     CMP    AL,' '          ;NO MORE OPT'NS?
  1604.     Jnz    Brate            ;If so, check specified baud rate
  1605.     Jmp    Endext            ;Exit!
  1606. ;
  1607. ;  This function sets the baud rate.
  1608. ;
  1609. Brate:    Mov    Si,Offset Bdtab        ; Get address of table
  1610.     Mov    Ah,[Si]            ; Number entries
  1611.     Xor    Cx,Cx            ; Clear count
  1612. ;
  1613. Bloop:    Inc    Si            ; Point to char string
  1614.     Mov    Cl,03h            ; Get string count
  1615.     Mov    Di,Bx            ; Source string in FCB
  1616.     Rep    Cmpsb            ; Check specified baudrate from tbl
  1617.     Jz    Brfnd            ; If ok, then we found the baudrate
  1618. Bloop1:    Inc    Si            ; Bump pointer
  1619.     Loop    Bloop1            ; Until end of string
  1620.     Dec    Ah            ; Bump entry count
  1621.     Jnz    Bloop            ; Loop
  1622.     Mov    Al,10h            ; Default to 9600
  1623.     Jmp    Bset            ; Set bud rate
  1624. ;
  1625. Brfnd:    Mov    Al,[Si]            ; Get new baud rate
  1626. ;
  1627. Bset:    Mov    Brr,Al            ; Save Rx baud rate
  1628.     Mov    Brt,Al            ; Save Tx baud rate
  1629. Endext:    ret
  1630. ;
  1631. ;IF "VIEW" WAS ASKED FOR, SET QUIET FLAG
  1632. ;
  1633.     MOV    AL,VSEEFLG    ;VIEW..
  1634.     OR    AL,AL       ;..ASKED FOR?
  1635.     JZ    L00100
  1636.     RET                 ;..NO, RET FROM 'PROCOPT'
  1637. L00100:    MOV       QFLG,AL     ;YES, NO HDR/CKSUM PRT
  1638.     RET                 ;FROM 'PROCOPT'
  1639. PROCOPT ENDP
  1640. ;
  1641. ;DONE - CLOSE UP SHOP
  1642. ;
  1643. DONE    PROC    NEAR
  1644.          MOV    AL,VSEEFLG    ;VIEWING?
  1645.     OR    AL,AL
  1646.     JNZ    L00101
  1647.     JMP    DONETC      ;SHOW MSG
  1648. L00101:    MOV    AL,QFLG     ;QUIET
  1649.     OR    AL,AL       ;..MODE?
  1650.     JNZ    DONETC 
  1651.     JMP    DONECTE     ;YES, CK TERM/ECHO
  1652. DONETC:    PUSH    BX
  1653.     MOV    BX,OFFSET MSG14
  1654.     CALL    ILPRT
  1655.     POP    BX
  1656. ;
  1657. ;CHECK IF TERMINAL OR ECHO SUB COMMAND
  1658. ;WAS SPECIFIED
  1659. ;
  1660. DONECTE:
  1661.     MOV    AL,TERMFLG    ;TERM?
  1662.     OR    AL,AL
  1663.     JNZ    L00103
  1664.     JMP    TERM        ;..YES
  1665. L00103:    MOV    AL,ECHOFLG    ;ECHO?
  1666.     OR    AL,AL
  1667.     JNZ    CKDIS 
  1668.     JMP    TRMECHO     ;..YES
  1669. ;
  1670. ;FALL INTO 'CKDIS'
  1671. ;
  1672. ;---->    CKDIS: CHECK IF DISCONNECT REQUESTED
  1673. ;
  1674. ;THIS ROUTINE IS JUMPED TO AT THE END OF
  1675. ;PROCESSING, AND DISCONNECTS THE PHONE IF
  1676. ;'D' WAS SPECIFIED AS A SUB-OPTION.
  1677. ;
  1678. CKDIS:    MOV    AL,DISCFLG    ;CHECK 'D' FLAG
  1679.     OR    AL,AL       ;REQUESTED?
  1680. ;
  1681. ;AWAIT C/R TO DISC or space bar to just exit SO WE DON'T LOSE THE PHONE
  1682. ;
  1683.     PUSH    BX
  1684.     MOV    BX,OFFSET MSG15
  1685.     CALL    ILPRT
  1686.     POP    BX
  1687.     CALL    KEYIN
  1688.     LAHF
  1689.     XCHG    AL,AH
  1690.     PUSH    AX
  1691.     XCHG    AL,AH
  1692.     CALL    CRLF
  1693.     POP    AX
  1694.     XCHG    AL,AH
  1695.     SAHF    
  1696.     CMP    AL,20H
  1697.     JE    DISCONN
  1698.     CMP    AL,0DH
  1699.     JNE    CKDIS
  1700.  
  1701. ;
  1702. ;---->    DISCONN: DISCONNECT THE PHONE
  1703. ;
  1704.     MOV    BYTE PTR Misc_CCB.Function,14    ; Function - Set modem signals
  1705.     MOV    BYTE PTR Misc_CCB.Character,0    ; Reset all bits
  1706.     MOV    DX,OFFSET Misc_CCB        ; Packet at DS:DX
  1707.     MOV    BYTE PTR Misc_CCB.Buffer,1    ; Device number 1
  1708.     MOV    BX,3                ; Handle for Comms
  1709.     MOV    AX,4402H            ; IOCTOL function
  1710.     INT    21H                ; Call MS-DOS
  1711.  
  1712. DISCONN:
  1713.     PUSH    BX
  1714.     MOV    BX,OFFSET msg16
  1715.     CALL    Ilprt
  1716.     POP    BX
  1717.     JMP    Exit
  1718. DONE    ENDP
  1719. ;
  1720. ;NO DISCONNECT, TYPEZZ MSG AS REMINDER THAT PHONE'S
  1721. ;ON HOOK
  1722. ;
  1723. ;
  1724. ;---->    INITMOD: INITIALIZED THE MODEM
  1725. ;
  1726. ;THIS ROUTINE IS USED TO INITIALIZE SERIAL
  1727. ;PORT USED BY THE PROGRAM. 
  1728. ;
  1729. ;
  1730. ;
  1731. ;    INIT COMM PORTS
  1732. ;    
  1733. INITMOD PROC    NEAR
  1734.     Mov    AX,CS            ; Set up Segment and offset
  1735.     Mov    Word Ptr Bsegm,AX    ; of our comms. buffer
  1736.     Mov    AX,Offset Comm_buffer    ; .
  1737.     Mov    Word Ptr Boff,AX    ; ..
  1738. ;
  1739.     MOV    DX,OFFSET INIT_CCB    ; DS:DX points to control block
  1740.     MOV    AX,4402H        ; IOCTL function program to default
  1741.     MOV    BX,3            ; File handle for comms
  1742.     INT    21H            ; Call MS-DOS
  1743. ;
  1744. ; Here we have to enable the receiver
  1745. ;
  1746.     Mov    Byte Ptr MISC_CCB.FUNCTION,04    ; Enable receiver
  1747.     MOV    DX,OFFSET MISC_CCB    ; DS:DX points to control block
  1748.     MOV    AX,4402H        ; IOCTL function program to default
  1749.     MOV    BX,3            ; File handle for comms
  1750.     INT    21H            ; Call MS-DOS
  1751. ;
  1752. ; Bring up DTR,RTS and SRTS
  1753. ;
  1754.  
  1755.     MOV    BYTE PTR Misc_CCB.Function,14        ; Set modem signals
  1756.     MOV    BYTE PTR Misc_CCB.Character,1110B    ; DTR, RTS and SRTS.
  1757.     MOV    BYTE PTR Misc_CCB.Buffer,1        ; Comm port
  1758.     MOV    DX,OFFSET Misc_CCB            ; Packet at DS:DX
  1759.     MOV    AX,4402H                ; Function IOCTL
  1760.     MOV    BX,3                    ; Handle for comms
  1761.     INT    21H                    ; Call MS-DOS
  1762.  
  1763.  
  1764.     RET
  1765. ;
  1766. INITMOD    ENDP
  1767. ;
  1768. Statit    Proc    Near
  1769. ;
  1770. ; See if there is a character available from the serial port
  1771. ;
  1772.     Push    Bx                ; Save registers
  1773.     Push    Dx
  1774.     MOV    AX,4402H            ; IOCTL function input Char.
  1775.     MOV    BX,3                ; File handle for AUX
  1776.     MOV    DX,OFFSET IN_CCB        ; DS:DX points to control blk.
  1777.     INT    21H                ; Call MS-DOS
  1778. ;
  1779.     Mov    Al,BYTE PTR IN_CCB.RETURN_CODE    ; Did we get a character?
  1780.     Pop    Dx                ; Restore registers
  1781.     Pop    Bx
  1782.     Ret                    ; Exit
  1783. ;
  1784. Statit    Endp
  1785. ;
  1786. Getit    Proc    Near
  1787. ;
  1788.     MOV    AL,BYTE PTR IN_CCB.CHARACTER    ; GET CHAR
  1789.     Ret
  1790. ;
  1791. Getit    Endp
  1792. ;
  1793. ; On Entry:
  1794. ;        Al = Character
  1795. ;
  1796. ; On Exit:
  1797. ;        Ah = Status
  1798. ;             FFh - Character sent
  1799. ;             00h - Character not sent
  1800. ;        Al = Character
  1801. ;
  1802. Sendit    Proc    Near
  1803. ;
  1804. ; Output character to serial port using MS-DOS IOCTL
  1805. ;
  1806.     Push    Bx                ; Save Register
  1807.     Push    Dx
  1808. ;    
  1809.     MOV    BYTE PTR OUT_CCB.CHARACTER,AL    ; Character in control block
  1810.     MOV    AX,4402H            ; IOCTL function out
  1811.     MOV    BX,3                ; Handle for AUX
  1812.     MOV    DX,OFFSET OUT_CCB        ; DS:DX points to control block
  1813.     INT    21H                ; Call MS-DOS
  1814. ;
  1815.     Mov    Ah,Out_CCB.Return_code        ; Get status of operation
  1816.     Mov    Al,Out_CCB.Character        ; Get character sent
  1817.     Pop    Dx                ; Restore registers
  1818.     Pop    Bx
  1819.     Ret
  1820. ;
  1821. Sendit    Endp
  1822. ;
  1823. ;
  1824. ;---->    MOVEFCB: MOVES FCB(2) TO FCB
  1825. ;
  1826. ;I ATTEMPTED TO MAKE THE MODEM COMMAND 'NATURAL',
  1827. ;I.E. MODEM SEND FILENAME (MODEM S FN.FT) RATHER
  1828. ;THAT MODEM FILENAME SEND (MODEM FN.FT S) SO THIS
  1829. ;ROUTINE MOVES THE FILENAME FROM THE SECOND FCB
  1830. ;TO THE FIRST
  1831. ;
  1832. MOVEFCB PROC    NEAR
  1833.     MOV    BX,OFFSET FCB2  ;FROM
  1834.     MOV    DX,OFFSET FCB   ;TO
  1835.     MOV    CH,16           ;LEN
  1836.         PUSH    DS        ;SAVE DS
  1837.         PUSH    ES        ;MOVE ES ...
  1838.         POP    DS        ;... TO DS
  1839.     CALL    MOVE            ;DO THE MOVE
  1840.     POP    DS        ;RESTORE DS    
  1841.     XOR    AL,AL           ;GET 0
  1842.     MOV       FCBCR,AL        ;ZERO CURRENT RECORD
  1843.     MOV      FCBRR,AL        ;..AND RANDOM RECORD
  1844.     RET         
  1845. MOVEFCB    ENDP
  1846. ;
  1847. ;---->    SHOW: SHOWS CHAR SENT/RECEIVED
  1848. ;
  1849. ;CR, LF, AND TAB ARE SHOWN.  ALL OTHER
  1850. ;NON-PRINTABLE CHARACTERS ARE SHOWN IN
  1851. ;HEX AS (XX)
  1852. ;
  1853. SHOW    PROC    NEAR
  1854.          CMP    AL,LF       ;LF?
  1855.     JNZ    L00122
  1856.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1857. L00122:    CMP    AL,CR       ;CR?
  1858.     JNZ    L00123
  1859.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1860. L00123:    CMP    AL,09       ;TAB
  1861.     JNZ    L00124
  1862.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1863. L00124:    CMP    AL,' '      ;CTL-CHR?
  1864.     JAE    L00125
  1865.     JMP    SHOWHEX     ;YES, SHOW IN HEX
  1866. L00125:    CMP    AL,7FH      ;DEL?
  1867.     JAE    SHOWHEX
  1868.     JMP    CTYPEZZ     ;NO, TYPEZZ THE CHAR
  1869. SHOWHEX LABEL    NEAR
  1870.     LAHF
  1871.     XCHG    AL,AH
  1872.     PUSH    AX
  1873.     XCHG    AL,AH       ;SAVE THE CHAR
  1874.     MOV    AL,'('      ;TYPEZZ..
  1875.     CALL    CTYPEZZ     ;..'('
  1876.     POP    AX
  1877.     XCHG    AL,AH
  1878.     SAHF                ;THEN..
  1879.     CALL    HEXO        ;..THE CHAR
  1880.     MOV    AL,')'      ;THEN..
  1881.     JMP    CTYPEZZ     ;..')' AND RETURN.
  1882. ;
  1883. ;---->    CTYPEZZ: TYPEZZS VIA CP/M SO TABS ARE EXPANDED
  1884. ;
  1885. CTYPEZZ LABEL   NEAR
  1886.     PUSH    CX          ;SAVE..
  1887.     PUSH    DX          ;..ALL..
  1888.     PUSH    BX          ;..REGS
  1889.     MOV    DL,AL       ;CHAR TO E
  1890.     MOV    CL,WRCON    ;GET BDOS FNC
  1891.     CALL    BDOS        ;PRIN THE CHR
  1892.     POP    BX          ;RESTORE..
  1893.     POP    DX          ;..ALL..
  1894.     POP    CX          ;..REGS
  1895.     RET                 ;FROM "CTYPEZZ"
  1896. SHOW    ENDP
  1897. ;
  1898. CRLF    PROC    NEAR
  1899.          MOV    AL,CR
  1900.     CALL    TYPEZZ
  1901.     MOV    AL,LF
  1902. CRLF    ENDP
  1903. ;
  1904. ;---->    TYPEZZ: TYPEZZ VIA DIRECT BDOS ACCESS
  1905. ;
  1906. ;THIS ROUTINE BYPASSES CP/M'S CTL-S, CTL-C
  1907. ;TESTS.
  1908. ;
  1909. TYPEZZ    PROC    NEAR
  1910. ;
  1911. ; Now we output the character to the display using the firmware
  1912. ;
  1913.     PUSH    AX                ; save char
  1914.     PUSH    Di
  1915.     XOR    DI,DI                ; output to console
  1916.     INT    ROM
  1917.     Pop    Di
  1918.     POP    AX                ; restore char
  1919.     RET                 ;FROM "TYPEZZ"
  1920. TYPEZZ    ENDP
  1921. ;
  1922. ;KEYBOARD STATUS
  1923. ;
  1924. ;    This routine has been changed from CP/M-86: the service for
  1925. ;    MS-DOS differs in several respects.. [CP/M version uses
  1926. ;    x'FE' in DL and calls "DCON" which isn't supported
  1927. ;    in MSDOS .. SO we use the direct bios call.
  1928. ;
  1929. STAT    PROC    NEAR
  1930.     Push    Cx                ; Save register
  1931.     Push    Di
  1932.     MOV    DI,4                ; Get console status
  1933.     INT    ROM
  1934.     Mov    Al,Cl                ; Get status
  1935.      OR    AL,AL               ;0 => NOT READY
  1936.     Pop    Di                ; Restore registers
  1937.     Pop    Cx
  1938.     RET
  1939. STAT    ENDP
  1940. ;
  1941. ;KEYBOARD INPUT
  1942. ;
  1943. ;    This routine has been changed to use direct BIOS interface.
  1944. ;    CTRL-C sequences are intercepted and interpreted as 
  1945. ;    termination requests
  1946. ;
  1947. KEYIN    PROC    NEAR
  1948.  
  1949.     Push    Bx
  1950.     Push    Cx                ; Save registers
  1951.     Push    Di
  1952.  
  1953. Keylp:    MOV    DI,2                ; input from KEYBOARD
  1954.     INT    ROM
  1955.     Or    CL,CL
  1956.     JZ    Keylp                ; skip if no input
  1957. ;
  1958.     CMP    AL,CTLCCHR            ; Was it a "Control-C"
  1959.     JNE    Keyext                ; If not, exit
  1960.     MOV    AL,CTLCHAR            ; Substitute a real ^C
  1961. ;
  1962. Keyext:    Pop    Di                ; Restore registers
  1963.     Pop    Cx
  1964.     Pop    Bx
  1965.     Ret
  1966.  
  1967. KEYIN     ENDP
  1968. ;
  1969. ;HEX OUTPUT
  1970. ;
  1971. HEXO    PROC    NEAR
  1972.          LAHF
  1973.     XCHG    AL,AH
  1974.     PUSH    AX
  1975.     XCHG    AL,AH       ;SAVE FOR RIGHT DIGIT
  1976.     RCR    AL,1        ;RIGHT..
  1977.     RCR    AL,1        ;..JUSTIFY..
  1978.     RCR    AL,1        ;..LEFT..
  1979.     RCR    AL,1        ;..DIGIT..
  1980.     CALL    NIBBL       ;PRINT LEFT DIGIT
  1981.     POP    AX
  1982.     XCHG    AL,AH
  1983.     SAHF                ;RESTORE RIGHT
  1984. NIBBL:    AND    AL,0FH      ;ISOLATE DIGIT
  1985.     CMP    AL,10       ;IS IS <10?
  1986.     JAE    L00127
  1987.     JMP    ISNUM       ;YES, NOT ALPHA
  1988. L00127:    ADD    AL,7        ;ADD ALPHA BIAS
  1989. ISNUM:    ADD    AL,'0'      ;MAKE PRINTABLE
  1990.     JMP    TYPEZZ      ;..THEN TYPEZZ IT
  1991. HEXO    ENDP
  1992. ;
  1993. ;---->    CKQUIT: QUIT/RETRY AFTER MULTIPLE ERRS.
  1994. ;
  1995. ;RETURNS W/ ZERO SET IF "RETRY" ASKED FOR
  1996. ;
  1997. CKQUIT    PROC    NEAR
  1998.            XOR    AL,AL       ;ZERO..
  1999.     MOV       ERRCT,AL    ;..ERROR COUNT
  2000.     PUSH    BX
  2001.     MOV    BX,OFFSET MSG18
  2002.     CALL    ILPRT       ;PRINT:
  2003.     POP    BX
  2004.     CALL    KEYIN       ;QUIT/RETRY
  2005.     LAHF
  2006.     XCHG    AL,AH
  2007.     PUSH    AX
  2008.     XCHG    AL,AH
  2009.     CALL    CRLF
  2010.     POP    AX
  2011.     XCHG    AL,AH
  2012.     SAHF    
  2013.     AND    AL,5FH      ;MAKE UPPER CASE
  2014.     CMP    AL,'R'      ;RETRY?
  2015.     JNZ    L00128
  2016.     RET                 ;'KEEP ON TRUCKIN'
  2017. L00128:    CMP    AL,'Q'      ;QUIT?
  2018.     JZ    L00129
  2019.     JMP    CKQUIT      ;NO, ASK AGAIN
  2020. L00129:    OR    AL,AL       ;SET NON-ZERO
  2021.     RET
  2022. CKQUIT    ENDP
  2023. ;
  2024. ;---->    ILPRT: INLINE PRINT OF MSG
  2025. ;
  2026. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  2027. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  2028. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  2029. ;
  2030. ILPRT     PROC    NEAR
  2031. ILPLP:    MOV    AL,BYTE PTR[BX]
  2032.     OR    AL,AL           ;END OF MSG?
  2033.     JNZ    L00130
  2034.     JMP    ILPRET          ;..YES, RETURN
  2035. L00130:    CMP    AL,1            ;PAUSE?
  2036.     JNZ    L00131
  2037.     JMP    ILPAUSE         ;..YES
  2038. L00131:    CALL    CTYPEZZ         ;TYPEZZ THE MSG
  2039. ILPNEXT:
  2040.         PUSHF
  2041.     INC    BX
  2042.     POPF                    ;TO NEXT CHAR
  2043.     JMP    ILPLP           ;LOOP
  2044. ;
  2045. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  2046. ;    SCROLL OFF OF VIDEO SCREENS
  2047. ;
  2048. ILPAUSE:
  2049.     PUSH    BX
  2050.     MOV    BX,OFFSET MSG19
  2051.     CALL    ILPRT           ;PRINT:
  2052.     POP    BX
  2053.     CALL    KEYIN           ;GET ANY CHAR
  2054.     CMP    AL,'C'-40H      ;REBOOT?
  2055.     JNZ     L09132        ;EXIT IF QUITCHAR
  2056.     JMP    EXIT
  2057. L09132:    CMP    AL,'I'-40H    ;ALT REBOOT?
  2058.     JNZ    L00132        ;
  2059.     JMP    EXIT            ;YES.
  2060. L00132:    JMP    ILPNEXT         ;LOOP
  2061. ILPRET:    RET                     ;PAST MSG
  2062. ILPRT    ENDP
  2063. ;
  2064. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  2065. ;
  2066. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  2067. ;NO REGISTERS SAVED.
  2068. ;
  2069. PRTMSG    PROC    NEAR
  2070.            MOV    CL,PRINT        ;GET BDOS FNC
  2071.     JMP    BDOS            ;PRINT MESSAGE, RETURN
  2072. PRTMSG    ENDP
  2073. ;
  2074. ;---->    ERXIT: EXIT PRINTING MSG FOLLOWING CALL
  2075. ;
  2076. ERXIT    PROC    NEAR
  2077.           POP    BX              ;GET MESSAGE
  2078.     CALL    PRTMSG          ;PRINT IT
  2079.     CALL    CKDIS           ;DISCONNECT?
  2080.     JMP     EXIT            ;RETURN TO PC DOS       
  2081. ERXIT    ENDP
  2082. ;
  2083. ;MOVE 128 CHARACTERS
  2084. ;
  2085. MOVE128 PROC      NEAR
  2086.     MOV    CH,128          ;SET MOVE COUNT
  2087. ;
  2088. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  2089. ;
  2090. MOVE:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  2091.     XCHG    BX,DX
  2092.     MOV    [BX],AL
  2093.     XCHG    BX,DX           ;STORE IT
  2094.     PUSHF
  2095.     INC    BX
  2096.     POPF                    ;TO NEXT "FROM"
  2097.     PUSHF
  2098.     INC    DX
  2099.     POPF                    ;TO NEXT "TO"
  2100.     DEC    CH              ;MORE?
  2101.     JZ    L00133
  2102.     JMP    MOVE            ;..YES, LOOP
  2103. L00133:    RET                     ;..NO, RETURN
  2104. MOVE128    ENDP
  2105. ;
  2106. BDOS    PROC    NEAR
  2107.     PUSH    BX
  2108.     PUSH    CX
  2109.     PUSH    DX
  2110.     MOV    AH,CL        ;MOVE FNC FOR PC DOS
  2111.     INT     21H            ;INVOKE MS-DOS        
  2112.     POP    DX
  2113.     POP    CX
  2114.     POP    BX
  2115.     RET
  2116. BDOS    ENDP
  2117. ;
  2118. BADOPT:    CALL    TYPEZZ
  2119.     PUSH    BX
  2120.     MOV    BX,OFFSET MSG25
  2121.     CALL    ILPRT
  2122.     POP    BX
  2123. HELP:    PUSH    BX
  2124.     MOV        BX,OFFSET MSG26
  2125.     CALL     ILPRT
  2126.     POP    BX
  2127.     JMP    copyrt
  2128. EXAM:    PUSH    BX
  2129.     MOV     BX,OFFSET MSG27
  2130.     CALL    ILPRT
  2131.     POP    BX
  2132.     JMP    copyrt
  2133. ;
  2134. ;  Print Limited license with "HELP" request output
  2135. ;
  2136. copyrt:    CALL    STAT
  2137. ;
  2138. ;    CLEAR THE SCREEN (cursor = 1,1)
  2139. ;
  2140. ;
  2141. ;    PRINT COPYRIGHT NOTICE  AND PAUSE 
  2142. ;
  2143.     mov    bx,offset msg00 ;point to copyright notice
  2144.     call    ilprt        ; go print it (PAUSE)
  2145. ;
  2146. ;    RETURN TO CALLER 
  2147. ;
  2148.     jmp    exit
  2149. ;
  2150. Comm_Buffer    Label    Word
  2151. ;
  2152. ;
  2153. MODEM   ENDS
  2154.     SUBTTL    'MODIFICATION HISTORY AND CREDITS'
  2155.     PAGE
  2156. ;
  2157. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2158. ;*                         *
  2159. ;*   THIS PROGRAM DOCUMENTED IN "MODEM.DOC"     *
  2160. ;*                         *
  2161. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2162. ;* THIS PROGRAM WAS "MODEM.ASM" BUT and then was * 
  2163. ;* TEMPORARILY NAMED "MODEM2.ASM" SO PEOPLE     *
  2164. ;* WILL REALIZE IT IS AN ENHANCEMENT OF         *
  2165. ;* THE ORIGINAL PROGRAM "MODEM.ASM" ON CP/M     * 
  2166. ;* USER'S GROUP DISK 25.             *
  2167. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2168. ;
  2169. ;PLEASE PASS ON MODS, BUGS, ETC, SO YOUR
  2170. ;FIXES OR ENHANCEMENTS MAY BE SHARED BY ALL,
  2171. ;
  2172. ;Please send to the bottom name on the list,
  2173. ;    OR TO ALL OF US - if you can afford
  2174. ;              the time
  2175. ;
  2176. ;    Ward Christensen
  2177. ;    688 E. 154th St. #5D
  2178. ;    Dolton, Il. 60419
  2179. ;
  2180. ;    (312) 849-6279
  2181. ;
  2182. ;You may send a self-addressed stamped postcard
  2183. ;to be informed of changes/bugs as they become
  2184. ;known.     [CP/M Version]
  2185. ;
  2186. ;
  2187. ;
  2188. ;       05/08/82
  2189. ;Modified for CP/M 86 and the IBM PC 
  2190. ; by Randy Suess
  2191. ;    5219 Warwick
  2192. ;    Chicago, Ill 60641
  2193. ;    312-545 7535
  2194. ;
  2195. ;       06/03/82
  2196. ;Modified for PC DOS and the IBM PC
  2197. ;by Rick Mallinak
  2198. ;   22451 Franklin Dr.
  2199. ;   Richton Park, Ill 60471
  2200. ;   (312) 481-6459
  2201. ;
  2202. ;    08/11/82
  2203. ;Repaired for PC DOS 1.1 and IBM PC
  2204. ;by John Chapman
  2205. ;   844 S. Madison St.
  2206. ;   Hinsdale Illinois 60521
  2207. ;   (312) 325-3081
  2208. ;                 CS: 70205,1217
  2209. ;
  2210. ;  
  2211. ;
  2212. ;       --------------------
  2213. ;       MODIFICATION HISTORY
  2214. ;    --------------------
  2215. ;
  2216. ;    09/23/77
  2217. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  2218. ;
  2219. ;    04/26/79
  2220. ;REWRITTEN BY WARD CHRISTENSEN TO COMBINE
  2221. ;IMPROVEMENTS TO THE ORIGINAL MADE BY WARD
  2222. ;AND BY KEITH PETERSEN, W8SDZ, AND SUGGESTIONS
  2223. ;BY JIM BELL WHICH KEITH IMPLEMENTED.  SEE
  2224. ;MODEM.DOC FOR ADDITIONAL HISTORICAL
  2225. ;INFORMATION AND DOCUMENSATION.
  2226. ;
  2227. ;    05/09/79
  2228. ;ALLOW 'T' AND 'E' SUB-OPTIONS TO GO TO TERMINAL
  2229. ;OR ECHO MODEM AFTER TRANSFERRING A FILE.  (WLC)
  2230. ;
  2231. ;    05/22/79
  2232. ;ADD FEATURE TO MAKE RECEIVE FILE ROUTINE SAY
  2233. ;FILE SUCCESSFULLY OPENED, WHEN IN QUIET MODE.
  2234. ;MOVE INITIAL GOBBLE GARBAGE INPUTS TO BEFORE
  2235. ;COMMAND CPI'S SO ALL MODES ARE CLEARED. CHANGE
  2236. ;INITIAL SEND WAIT TO 80 SECS TO ALLOW MORE TIME
  2237. ;FOR RECEIVING END TO COME UP. ADD 'H' AFTER MSG
  2238. ;THAT SHOWS NUMBER OF SECTORS IN EXTENT ABOUT TO
  2239. ;BE SENT.  (KBP)
  2240. ;
  2241. ;    05/24/79
  2242. ;FIX MISSING RETURN INSTRUCTION AT END OF
  2243. ;INITIALIZATION ROUTINE.  (KBP)
  2244. ;
  2245. ;    07/13/79
  2246. ;PUT IN RESET OF DMA ADDR TO 80H AFTER
  2247. ;FILE RECEIVE, BECAUSE "SUBMIT" UNDER CP/M
  2248. ;DOESN'T RESET IT BEFORE READING THE
  2249. ;NEXT SUBMITTED COMMAND. /// ALSO DELETE
  2250. ;CODE FOR "CANCEL" AS IT'S JUST TOO EASY
  2251. ;TO INTENTIONALLY GET A CANCEL AS A
  2252. ;GARBAGED LINE CHARACTER.
  2253. ;
  2254. ;
  2255. ;
  2256. ;           05/82
  2257. ;    
  2258. ;Rewritten for CP/M-86 by Randy Suess
  2259. ;Changes mainly to interface with 
  2260. ;the CP/M-86 BDOS services 
  2261. ;
  2262. ;        06/82
  2263. ;
  2264. ;Randy's version altered by Rick Mallinak
  2265. ;to be acceptable to PC/DOS assembler.
  2266. ;Comments added and changes made to
  2267. ;support multiple segment version
  2268. ;
  2269. ;           08/82
  2270. ;
  2271. ;Rick's PC/DOS version reworked
  2272. ;to: a) Run as a .COM file by
  2273. ;returning to single segment image;
  2274. ;b) terminal bugs repaired,; c) code
  2275. ;added to 'bring up' DTR as program
  2276. ;starts up [necessary for non-autodial
  2277. ;commercial modems].
  2278. ;
  2279. ;    01/84
  2280. ;
  2281. ;Version 3.3 of modem for the RAINBOW was 
  2282. ;converted from the IBM-PC implementation by
  2283. ;Jim Colombo, DEC - RAINBOW SOFTWARE GROUP 
  2284. ;with the additional feature of specifing the
  2285. ;baud rate on the command line. Version 3.3.1
  2286. ;changes the way modem sends character using the
  2287. ;IOCTL function. The Transmitter now uses function
  2288. ;10 (Send character, return is unsuccessful) and 
  2289. ;the character is queued if the character wasn't
  2290. ;sent.
  2291. ;
  2292. ;
  2293. ;    10/84
  2294. ;Version 3.3.2 fixes bug with sending files less
  2295. ;than 15 sectors in length. If the MS/DOS sequential
  2296. ;read (INT 21H, AH = 14H) function returns a partial
  2297. ;read error (3), then that sector must also be sent!
  2298. ;Also fixed bug with KEYIN trashing the BX register.
  2299. ;
  2300. ;    10/84
  2301. ;Version 3.3.3 Added improved control of DTR on exit and cleaned
  2302. ;up comments.
  2303. ;
  2304. ;    01/18/85
  2305. ;Version 3.3.4 Reset comm port to NVM values on exit. 
  2306. ; Marshall Goldberg.
  2307. ;
  2308.  
  2309.     END     MAIN
  2310.